Ciao Xerxe,
ho risolto abbastanza bene con quella query (e ti confermo che purtroppo è un prodotto per terzi ma risulta molto leggero), ho costruito le tabelle in maniera che contengano solamente dei numeri in maniera che il carico di lavoro del db sia molto basso. infatti in inserimento quella tabella riesce a ricevee 10000 insert in 30 secondi, con un pentium 4 dual core a 3Ghz. mentre in lettura quasi 4 volte tanto.
ti posto l'esport di questa tabella
Codice PHP:
-- phpMyAdmin SQL Dump
-- version 2.9.0.2
-- [url]http://www.phpmyadmin.net[/url]
--
-- Host: localhost
-- Generato il: 12 Ott, 2007 at 11:55 AM
-- Versione MySQL: 5.0.24
-- Versione PHP: 5.1.6
--
-- Database: `symposium`
--
-- --------------------------------------------------------
--
-- Struttura della tabella `pren_locali`
--
CREATE TABLE `pren_locali` (
`id_prog` int(16) NOT NULL auto_increment,
`cod_id` int(16) default NULL,
`tes_iscritto` varchar(16) default NULL,
`da` int(16) default NULL,
`a` int(16) default NULL,
`cod_corso` int(16) default NULL,
`giorno` int(16) default NULL,
`privata` int(2) default NULL,
PRIMARY KEY (`id_prog`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5001 ;
--
-- Dump dei dati per la tabella `pren_locali`
--
la query che ho fatto oltre ad estrarre i dati dalla tabella qui sopra li formatta in una semplice tabella con due colonne massimo per riga, ogni colonna stampa i dati per una stanza sola (il cod_id) e poi in base al numero di tessera che esce fuori fa una query su una tabella iscritti andandosi a prelevare il nome dell'iscritto.
questo è il codice. non ho utilizzato nessuna join o subqueries per fare questo script, perchè è solo la prima versione, quella di debug per vedere se funziona. in questo momento sto rimettendo a posto il tutto cercando di togliere più righe di codice possibile per garantire una maggiore leggibilità e performance all'applicazione.
Codice PHP:
<?php
// lo script si calcola il giorno in base a delle variabili che gli arrivano da un form di selezione su un altra pagina, gli viene passato il mese xm il giorno xd e l'anno xy e si calcola il timestamp del giorno, $x. accetta anche la variabile x già formattata.
if($_GET['xm']) {
$x=mktime(0,0,0,$xm,$xd,$xy);
}
else if($_GET['x']){
$x=$_GET['x'];
}
else{
$x=mktime(0,0,0,date("n"),date("d"),date("Y"));
}
$next_day=$x+86400;
$prev_day=$x-86400;
?>
</head>
<link href="style.css" rel="stylesheet" type="text/css">
<body style="margin: 3px;">
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab">
<tr>
<td align="left" valign="top">[url="GEOdx.php?x=<?php echo $prev_day; ?>"]<---Giorno Precedente[/url]</td>
<td align="center" valign="top">Data: <?php echo date("d/n/Y",$x); ?></td>
<td align="right" valign="top">[url="GEOdx.php?x=<?php echo $next_day; ?>"]Giorno Successivo---> [/url]</td>
</tr>
</table>
<TABLE width="100%" border="1" bordercolor="#000000" cellpadding="0" cellspacing="3" class="tab">
<TBODY>
<?php
include "config/db.inc"; // apro la connessione al DB
//ESTRAGGO DALLA TABELLA DEI LOCALI I PARAMETRI DELL'IMPAGINAZIONE E IL CODICE DEL LOCALE E LO CICLO
$query_param="SELECT cod_id,nome,sfondo,testo FROM locali ORDER BY nome ASC";
$result_param=mysql_query($query_param);
$i=1;
echo "<TR>";
while($query_data_param=mysql_fetch_array($result_param)) {
$i++;
$cod_id=$query_data_param['cod_id'];
$nome=$query_data_param['nome'];
$sfondo=$query_data_param['sfondo'];
$testo=$query_data_param['testo'];
echo "<TD width='50%' align='left' valign='top' style='background-color:$sfondo; color:$testo; '>";
echo "[b]".$nome."[/b]
";
//con la prima select mi estraggo tutti gli orari di inizio e fine lezione ordinati dal più piccolo al più grande e raggruppati per aggregare i range di orario uguali
$query="SELECT da,a FROM pren_locali WHERE giorno='$x' AND cod_id='$cod_id' GROUP BY da,a ORDER BY da ASC ";
$result=mysql_query($query);
$conteggio=mysql_num_rows($result);
if($conteggio<=0) {
echo "[i]Nessuna Prenotazione attiva[/i]";
}else{
while($query_data=mysql_fetch_assoc($result)) {
// mi estraggo quindi i campi "da" e "a" in un ciclo while e faccio una sotto query estraendomi il numero di tessera o i numeri di tessera che hanno queste caratteristiche
$da1=date("H:i",($query_data['da']-1)); // rendo comprensibile il timestamp
$a1=date("H:i",($query_data['a']+1));
$da=$query_data['da'];
$a=$query_data['a'];
echo "Dalle: $da1
";
$query2="SELECT * FROM pren_locali WHERE giorno='$x' AND cod_id='$cod_id' AND da='$da' AND a='$a' ORDER BY tes_iscritto ASC";
$result2=mysql_query($query2);
while($query_data2=mysql_fetch_array($result2)) {
$tessera=$query_data2['tes_iscritto']; // qui mi sono estratto i numeri di tessera che hanno le caratteristiche sopra riportate
$cod_corso=$query_data2['cod_corso'];
$id_prog=$query_data2['id_prog'];
//adesso in base al numero di tessera mi estraggo i dati dell'iscritto
$query_dati="SELECT nome,cognome FROM iscritti WHERE num_tessera='$tessera'";
$result_dati=mysql_query($query_dati);
$query_data_dati=mysql_fetch_array($result_dati);
$nominativo=$query_data_dati['nome']." ".$query_data_dati['cognome'];
//in base al codice corso mi estraggo il nome del corso e l'insegnante
$query_corso="SELECT corso,insegnante FROM corsi WHERE id='$cod_corso'";
$result_corso=mysql_query($query_corso);
$query_data_corso=mysql_fetch_array($result_corso);
$corso=$query_data_corso['corso'];
$insegnante=$query_data_corso['insegnante'];
echo "[i]".$nominativo." -- ".$corso." -- ".$insegnante." [url='GEMISscheda.php?num_tessera=$tessera'][img]grafica/view.png[/img][/url] [img]grafica/cancel.png[/img] [img]grafica/mass_del.jpg[/img][/i]
";
}
echo "
alle: $a1
<hr>";
}
}
echo "</TD>";
if ($i%2) {
echo "</TR>";
}
}
?>
</TBODY>
</TABLE>
</body>
</html>
<?php } ?>