Repository 32bit  Forum
Repository 64bit  Wiki

[Risolto] MySQL output

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[Risolto] MySQL output

Messaggioda kanzy » ven gen 22, 2010 16:29

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 :D
Ultima modifica di kanzy il dom gen 24, 2010 15:06, modificato 1 volta in totale.
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: MySQL output

Messaggioda conraid » ven gen 22, 2010 16:36

il campo data è del formato DATE?

Se sì prova con DATE_FORMAT
http://dev.mysql.com/doc/refman/5.1/en/ ... ate-format
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: MySQL output

Messaggioda kanzy » ven gen 22, 2010 16:39

@conraid

eh infatti.. se leggi bene l'ho considerato.. ma *come* lo inserisco?
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: MySQL output

Messaggioda conraid » ven gen 22, 2010 16:51

kanzy ha scritto:@conraid

eh infatti.. se leggi bene l'ho considerato.. ma *come* lo inserisco?


non avevo letto bene :oops:

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')
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: MySQL output

Messaggioda targzeta » ven gen 22, 2010 17:33

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6194
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: MySQL output

Messaggioda Naitso » ven gen 22, 2010 17:35

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
Avatar utente
Naitso
Linux 2.4
Linux 2.4
 
Messaggi: 205
Iscritto il: lun nov 10, 2008 15:09

Re: MySQL output

Messaggioda kanzy » ven gen 22, 2010 20:27

@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!
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: MySQL output

Messaggioda targzeta » ven gen 22, 2010 20:58

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6194
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: MySQL output

Messaggioda kanzy » sab gen 23, 2010 15:56

@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.
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: MySQL output

Messaggioda targzeta » sab gen 23, 2010 21:00

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6194
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: MySQL output

Messaggioda ermes » dom gen 24, 2010 9:13

anche io non sono sicuro di aver capito bene il problema...
hai provato a utilizzare la SELECT ... GROUP BY con tutte le sue varianti ?
Avatar utente
ermes
Linux 2.4
Linux 2.4
 
Messaggi: 340
Iscritto il: dom feb 20, 2005 0:00
Località: Rho (Mi)
Slackware: current 64
Desktop: kde

Re: MySQL output

Messaggioda kanzy » dom gen 24, 2010 14:02

@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 :-D - 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

Codice: Seleziona tutto
SELECT DATE_FORMAT(data, '%d-%b') FROM corse;
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: MySQL output

Messaggioda targzeta » dom gen 24, 2010 14:16

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

Codice: Seleziona tutto
SELECT DATE_FORMAT(data, '%d-%b') FROM corse;
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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6194
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: MySQL output

Messaggioda kanzy » dom gen 24, 2010 15:03

@spina
sì, su due link diversi.
Grazie 1000 Emanuele ho capito.. oggi spero di risolvere tutto per il meglio!
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite