Pagina 1 di 1
[Risolto] MySQL output
Inviato: ven 22 gen 2010, 16:29
da kanzy
ciao a tutti!
ho una tabella [id,data,corsa,organizza,raduno,localita,prov,email] di corse amatoriali che si svolgono in provincie adiacenti.
Per la consultazione, le query sono due: data e provincia.
Codice: Seleziona tutto
<dl><?php
$calenda=mysql_query("SELECT * FROM corse ORDER BY data");
while ($corsa=mysql_fetch_assoc($calenda)) {
echo "<dd>"; echo $corsa['data']; echo " ";
echo $corsa['corsa']; echo " ";
echo $corsa['raduno']; echo " ";
echo $corsa['localita']; echo " ";
echo " ("; echo $corsa['prov']; echo ")</dd>";
}
mysql_free_result($calenda);
mysql_close();
?></dl>
Codice: Seleziona tutto
<dl><?php
$calenda=mysql_query("SELECT * FROM corse GROUP BY prov ORDER BY data");
while ($corsa=mysql_fetch_assoc($calenda)) {
echo "<dd>"; echo $corsa['data']; echo " ";
echo $corsa['corsa']; echo " ";
echo $corsa['organizza']; echo " ";
echo $corsa['localita']; echo " ";
echo " ("; echo $corsa['prov']; echo ")</dd>";
}
mysql_free_result($calenda);
mysql_close();
?></dl>
Però... desidererei ottenere la prima query con le corse raggruppate sotto un
titolo col nome del mese [SELECT MONTH('data') FROM corse] e con la data
espressa soltanto dal giorno [SELECT DAY('data') FROM corse], così
----
MARZO
14 Coppa Primavera G.S.Veloclub Broni (PV)
21 Trofeo Colli Piacentini ProLoco Rivergaro (PC)
----
e la seconda query con le corse raggruppate sotto un titolo col nome della
provincia e la data con giorno e mese [SELECT DATE_FORMAT(data,%d %m)], così
----
PAVIA
14-3 Coppa Primavera G.S.Veloclub Broni (PV)
PIACENZA
21-3 Trofeo Colli Piacentini ProLoco Rivergaro (PC)
----
Ho provato in vari modi, soprattutto annidando i Select, ma senza risultati.
Per le 5 provincie potrei replicare la query sotto il nome di ogni provincia,
ma mi sembra prolisso e poco elegante; per i mesi, rischierebbe di essere più
lunga la fila di query del calendario. C'è qualche genietto del sequel che può
darmi una dritta?.. grazie anticipato a chi si prende la briga di spiegarmi
la soluzione

Re: MySQL output
Inviato: ven 22 gen 2010, 16:36
da conraid
il campo data è del formato DATE?
Se sì prova con DATE_FORMAT
http://dev.mysql.com/doc/refman/5.1/en/ ... ate-format
Re: MySQL output
Inviato: ven 22 gen 2010, 16:39
da kanzy
@conraid
eh infatti.. se leggi bene l'ho considerato.. ma *come* lo inserisco?
Re: MySQL output
Inviato: ven 22 gen 2010, 16:51
da conraid
kanzy ha scritto:@conraid
eh infatti.. se leggi bene l'ho considerato.. ma *come* lo inserisco?
non avevo letto bene
E mi sembra di capire che vuoi fare tutto con una query solamente.
Non sono il genietto che può aiutarti
anche perché ti avrei detto di fare come già fai
SELECT DATE_FORMAT(data,'%d %m')
Re: MySQL output
Inviato: ven 22 gen 2010, 17:33
da targzeta
Forse ho capito male, comunque le query ritornano già i risultati ordinati in modo corretto. Nel while ti basta mettere un controllo per verificare se il mese che stai analizzando è uguale o meno al mese corrente, stesso discorso per la provincia. Ad esempio per le provincie:
Codice: Seleziona tutto
...
$current_prov = '';
while ($corsa=mysql_fetch_assoc($calenda)) {
if ( $current_prov != $corsa['prov'] )
{
$current_prov = $corsa['prov'];
echo '<h4>' . $corsa['prov'] . '</h4>' . "\n";
}
echo "<dd>"; echo $corsa['data']; echo " ";
echo $corsa['corsa']; echo " ";
echo $corsa['organizza']; echo " ";
echo $corsa['localita']; echo " ";
echo " ("; echo $corsa['prov']; echo ")</dd>";
}
Spero di aver capito bene il problema e di aver spiegato bene l'idea

,
Emanuele
Re: MySQL output
Inviato: ven 22 gen 2010, 17:35
da Naitso
Non sono abilissimo con mysql, ma devi fare due query, la prima per ricavarti i mesi con gli eventi (penserei ad un flag per pubblicare o meno l'evento così puoi avere nel db date incerte ma scegli tu quando e se pubblicarle), raggrupparli per mese (così da non avere doppioni) e ordinarli da Gennaio ..... a Dicembre.
Codice: Seleziona tutto
SELECT DATE_FORMAT(date_cal, '%M') FROM calendar WHERE YEAR(date_cal) = '2010' GROUP BY DATE_FORMAT(date_cal, '%M') ORDER BY date_cal
e una seconda che esegue il SELECT degli eventi...
Spero ti possa aiutare
Ciao
Re: MySQL output
Inviato: ven 22 gen 2010, 20:27
da kanzy
@spina
grazie, stasera lo provo.. lo so che i dati escono già ordinati, ma il punto è estrarre giorno e mese (o data e provincia) ed utilizzarli uno per l'output e l'altro per il titolo.
@Naitso
sì, hai ragione, ma è proprio per evitare di fare due query (tanto per imparare qualcosa in più..) che cerco di trovare una soluzione diversa.
La tecnica in sè è quella di annidare le due query, ma le varianti sono diverse e per ora non ho trovato il modo.
Comunque stasera proverò anche la tua soluzione. Grazie!
Re: MySQL output
Inviato: ven 22 gen 2010, 20:58
da targzeta
kanzy ha scritto:@spina
grazie, stasera lo provo.. lo so che i dati escono già ordinati, ma il punto è estrarre giorno e mese (o data e provincia) ed utilizzarli uno per l'output e l'altro per il titolo.
...
Se è possibile ci ho capito ancora meno

. Comunque, fammi sapere se la mia soluzione fa più o meno quello che volevi per le provincie, perchè dall'output che hai mostrato mi sembra che vuoi questo tipo di comportamento.
Emanuele
Re: MySQL output
Inviato: sab 23 gen 2010, 15:56
da kanzy
@spina
scusa Emanuele se non mi sono espresso bene, forse per voler essere più chiaro possibile ho confuso le idee.
La questione, comunque, è semplicissima. Prendi un calendario o una agenda di appuntamenti qualunque.
Tutti gli eventi stanno sotto la voce (titolo, intestazione, come vuoi tu..) del mese relativo.
L'output del db li lista tutti di seguito, dal 1/1 al 31/12.
Fino ad ora ho inserito sempre 1 query per ogni mese (GROUP BY mese), per spezzare l'output ed
inserire il nome del mese come divisorio/intestazione.
Domanda: si può fare con una sola query (sicuramente complessa..)?.. oppure devo continuare col
solito metodo?..
Se la tua agenda ha centinaia di record il problema non si pone, se invece devi elencare le 15 gare di F1 o
cose simili, le query occupano più spazio degli appuntamenti. Da qui la curiosità di poter risolvere il tutto
con una query soltanto, cosa che penso possa interessare anche ad altri.
Il controllino che hai prospettato non funge, perchè inserisce il titolo (mese/provincia) insieme ad ogni corsa (trovandosi
nel ciclo while), dunque direi prolisso come output..
Meglio lo statement di Naitso come concept per un possibile raggruppamento dei titoli, ma da solo non è sufficiente.
Re: MySQL output
Inviato: sab 23 gen 2010, 21:00
da targzeta
L'ho detto io che non capisco

. Facciamo un esempio come per i bambini piccoli che mi trovo meglio. Ho questa tabella:
Codice: Seleziona tutto
|------------|--------|---------|
| DATA | PROV | CORSA |
|------------|--------|---------|
| 15/12/2010 | VT | Prima |
| 12/02/2010 | BO | Seconda |
| 07/06/2010 | VT | Terza |
|------------|--------|---------|
Normalmente il codice che ti ho suggerito dovrebbe darti l'ouput seguente (essendo già i risultati ordinati per provincia e per data, vista la tua query):
Codice: Seleziona tutto
BO
12/02/2010 Seconda
VT
07/06/2010 Terza
15/12/2010 Prima
Perchè è vero che il titolo viene stampato nel while, ma è vero anche che non tutti i record soddisfano il corpo dell'if che è nel while. In pratica il titolo viene stampato solo ad ogni cambio di provincia.
Se sto continuando a capire male, fammi tu un esempio di come vorresti vedere l'output di questa tabella,
Emanuele
Re: MySQL output
Inviato: dom 24 gen 2010, 9:13
da ermes
anche io non sono sicuro di aver capito bene il problema...
hai provato a utilizzare la SELECT ... GROUP BY con tutte le sue varianti ?
Re: MySQL output
Inviato: dom 24 gen 2010, 14:02
da kanzy
@spina
sì hai ragione!.. la prima prova mi aveva dato un output disordinato ridondante e privo di un record, ma, dopo la tua risposta

, oggi - meno frettolosamente

- ho verificato che inserendo `ORDER BY prov,data` tutto va a posto come dici tu. L'unica cosa che non so ancora spiegarmi (magari sbaglio qualcosa) è che non viene più stampato il primo record dell'output (non del db). Cioè, se ordino per prov manca il primo record di AL, se ordino per data manca la prima corsa. Hai qualche idea?..
Intanto grazie! un terzo del problema è [quasi] risolto con il codice così modificato:
Codice: Seleziona tutto
...
$calenda=mysql_query("SELECT * FROM corse ORDER BY prov,data");
$corsa=mysql_fetch_assoc($calenda);
$provincia="";
while ($corsa=mysql_fetch_assoc($calenda)) {
if ($provincia != $corsa['prov']) {
$provincia = $corsa['prov'];
echo "<tr><th>" . $corsa['prov'] . "</th></tr>";
}
echo "<tr><td>" . $corsa['data'] . "</td>";
echo "<td>" . $corsa['corsa'] . "</td>";
echo "<td>" . $corsa['organizza'] . "</td>";
echo "<td>" . $corsa['raduno'] . "</td>";
echo "<td>" . $corsa['localita'] . "</td>";
echo "<td>" . $corsa['prov'] . "</td></tr>";
}
Mi rimane da trovare una soluzione simile per i mesi, e come/dove inserire in entrambe le query
Re: MySQL output
Inviato: dom 24 gen 2010, 14:16
da targzeta
kanzy ha scritto:...L'unica cosa che non so ancora spiegarmi (magari sbaglio qualcosa) è che non viene più stampato il primo record dell'output (non del db). Cioè, se ordino per prov manca il primo record di AL, se ordino per data manca la prima corsa. Hai qualche idea?..
Ti commento il codice (nota i '<---'):
Codice: Seleziona tutto
...
$calenda=mysql_query("SELECT * FROM corse ORDER BY prov,data");
$corsa=mysql_fetch_assoc($calenda); <--- Prelevi un elemento ma non lo usi
$provincia="";
while ($corsa=mysql_fetch_assoc($calenda)) { <--- Sei al secondo elemento, il primo non l'hai stampato
...
dovresti togliere la prima invocazione di fetch_assoc.
kanzy ha scritto:...
Mi rimane da trovare una soluzione simile per i mesi, e come/dove inserire in entrambe le query
Non capisco cosa vuoi dire, se vuoi formattare la data in maniera più "carina" usa le funzioni di php e non quelle di MySQL. La soluzione per i mesi è veramente simile a quella delle provincie, se non sbaglio le due query erano separate a seconda di come vuoi l'ordinamento giusto?
Emanuele
Re: MySQL output
Inviato: dom 24 gen 2010, 15:03
da kanzy
@spina
sì, su due link diversi.
Grazie 1000 Emanuele ho capito.. oggi spero di risolvere tutto per il meglio!