Newsgroup: it.comp.www.php
Titolo: Mettere una SELECT in un loop

Ciao a tutti, la mia domanda riguarda piu' MYSQL che PHP.
Mi trovo in una situazione in cui apparentemente devo mettere una 
"SELECT" di MYSQL in un loop. Un esempio di codice:
 
 
//raggruppo i mesi inseriti nella colonna mese
$mese = mysql_query("SELECT mese FROM tabella GROUP BY mese");
while ($ris = mysql_fetch_array($mese))
{
     echo "<h1>".$ris['mese']."</h1>";  //"Ottobre" "Novembre" ecc
 
     //trovo tutti i record filtrati mese per mese
     $record = mysql_query("SELECT * FROM tabella WHERE mese = 
'$ris[mese]'";
     while ($ris2 = mysql_fetch_array($record))
     {
          echo "<p>".$ris2['qualcosa']."</p>";
     }
}
 
Questo Codice produrra' qualcosa del genere:
 
OTTOBRE
 
Dati di ottobre
Altri Dati
Ancora Dati
 
NOVEMBRE
 
Dati di novembre
Altri Dati
Ecc. ecc
 
 
E' errato eseguire una SELECT all'interno di un loop in questo modo?
C'e' un modo migliore di scrivere la query per ottenere lo stesso 
risultato?
Spero sia tutto chiaro. Grazie e buona domenica a tutti.
 
 

 }
 
dipende, il tuo esempio ï¿œ corretto, poi dipende dati dati che devi 
estrarre, potresti esempio andare in join con le 2 tabelle e eseguire il 
loop a rottura mese.
 
//raggruppo i mesi inseriti nella colonna mese
$mese = mysql_query("SELECT a.mese, b.* FROM tabella1 a, tabella2 b 
where a.mese = b.mese  GROUP BY a.mese");
while ($ris = mysql_fetch_array($mese))
{
     if {($ris['mese'] <> $mese)
        echo "<h1>".$ris['mese']."</h1>";
        $mese == $ris['mese'];
     }
     echo "<p>".$ris['qualcosa_della_seconda_tabella']."</p>";
}
 
questo potrebbe essere un esempio, ma molto dipende dal tipo di 
elaborazione che devi fare,
la select "SELECT a.mese, b.* FROM tabella1 a, tabella2 b where a.mese = 
b.mese  GROUP BY a.mese" produce un prodotto cartesiano dove i dati di 
"a" vengono ripetutti n volte quante sono le occorrenze di "b" che 
soddisfano la condizione "a.mese = b.mese".
ricoda che se un mese non ï¿œ contemplato in una sola delle tabelle non 
uscirï¿œ fuori.
 
nel tuo esempio se la prima tabella non contiene il mese di gennaio per 
esempio la seconda query neanche se ne accorge perchï¿œ nel loop non viene 
considerato gennaio.
se invece la prima tabella contiene gennaio e la seconda no, nel tuo 
esempio ti stamperï¿œ l'etichetta del mese ma poi non trovando dati con la 
seconda query questa uscira subito dal loop senza elaborarla.
 
nel mio esempio invece poichï¿œ si ï¿œ andato in join il mese di gennaio non 
compare proprio.
ci sono dei modi per ovviare questo (scrivere una query con un outer 
join) ma non mi sembra questo il NG adatto.
 
Ciao

 query questa uscira subito dal loop senza elaborarla.
 
Si si, di questo sono perfettamente consapevole
 
Ti ringrazio davvero tanto.
 
 

 tabella
Pensavo che utilizzassi 2 tabelle, ho capito male, allora anche meglio
lo stesso discorso che ho fatto vale anche per una sola tabella
 
 
  $mese = mysql_query("SELECT * FROM tabella GROUP BY mese");
  while ($ris = mysql_fetch_array($mese))
  {
       if {($ris['mese'] <> $mese)
          echo "<h1>".$ris['mese']."</h1>";
          $mese == $ris['mese'];
       }
       echo "<p>".$ris['qualcosa_della_tabella']."</p>";
  }
 
 
praticamente con la rottura a mese
       if {($ris['mese'] <> $mese)
 
stampi l'etichetta SOLO quando il mese è diverso.
 
 
Ciao

 Ciao
erroata corrige eliminare " GROUP BY mese""
 
Ciao

Nel suo scritto precedente, bramante ha sostenuto :

Ahha ok. Fantastico
Vado a lavorare e stasera provo.
Grazie ancora!
 
 

'$ris[mese]'";
 
SELECT b.*
    FROM (SELECT mese FROM tabella GROUP BY mese) AS a
    JOIN tabella AS b ON (a.mese = b.mese) ORDER BY a.mese;
 
Ma lo potresti fare altrettanto bene in PHP senza nessuna JOIN, visto
che tanto un controllo sul mese lo dovresti fare comunque, sicche' la
query che ho scritto li' sopra e' perfettamente superflua:
 
      $mese   = 'Puppaio';
      $record = mysql_query("SELECT * FROM tabella ORDER BY mese;");
 
      while($ris2 = mysql_fetch_array($record))
      {
          if ($mese != $ris2['mese'])
          {
              echo "<h1>".$ris2['mese']."</h1>";
              $mese = $ris2['mese'];
          }
          echo "<p>".$ris2['qualcosa']."</p>";
      }
 
Leonardo
 
-- 
What would'st thou do, my squire so gay, that rides beside my reine
Were ye Glenallan's Earl this tide, and I were Roland Cheyne?
To turn the rein were sin and shame, to fight were wondrous peril:
What would ye do now, Roland Cheyne, were ye Glenallan's Earl?

Il 21/10/2012 10:53, caccola ha scritto:

Tecnicamente è corretto, ma è orrendo
Due cose ti posso consilgiare:
*non* usare mysql_*() ma almeno usa PDO
Nel caso concreto, se non sai a priori gli estremi dell'intervallo che 
ti interessa fai una cosa del genere:
 
foreach($res1 as $rigares1){
	$idDaFiltrare[] = $rigares1['id'];
}
 
$query2 = "SELECT a,b,c from t where 
t.id
 in (:ids)";
$pdo->prepare($query2);
$pdo->execute(':ids',implode(",",$idDaFiltrare);
 
Così hai solo le righe che ti interessano.
L'uso di una subquery come sorgente degli ID non è male (tutt'altro), ma 
può essere che per ricavarti gli id che ti interessano tu debba fare 
calcoli non facilmente replicabili sul db
Ciao
M
 
-- 
I fatti mi cosano