Newsgroup: it.comp.www.php
Titolo: query di ragruppamento su piu campi su database mysql

Ciao a tutti, sono nuovo del NG.
Volevo sapere come fare per eseguire una query di ragruppamento su piu campi.
Io ho un sito dove le persone compilano un form specificando un determinato numero di campi.
I dati vengono memorizzati in un database mysql senza alcun problema.
Siccome le richieste sono molte, alle quali devo inviare un listino prezzi per il tipo di prodotto richiesto, e siccome
sono in tanti a chiedermi le stesse cose, vorrei fare un query che mi ragruppa le richieste in base ai valori di tre campi inseriti
e mi faccia un elenco degli indirizzi email delle persone che hanno richiesto il prezzo.
Questo mi permetterebbe di riuscire a risparmiare tempo e fare solo alcune interrogazioni al mio listino prezzi (in locale sul pc) ed 
una volta ottenuto il risultato, invio a tutti gli indirizzi email che mi hanno chiesto tale prodotto.
Non chiedo di fare tutto in php, l'invio lo faccio io a mano tramite outlook, ma se riuscissi ad avere una lista, di indirizzi email corrispondenti alla richiesta di 
un particolar prodotto,sarei molto agevolato.
Faccio un esempio.
Attualmente quando interrogo il mio db con un select * from tabella, ottengo la lista di tutte le richieste, sotto forma di tabella in html.
Poi io a mano mi guardo ogni singola richiesta ed inizio a consultare il mio listino prezzi ed rispondo via email all'indirizzo email, inviando via outlook il listino richiesto.
A volte mi capita fare 20 volte la stessa ricerca e di inviarla, e quindi e qui che mi occorre un ragruppamento.
Se io avessi una lista del tipo:
nome prodotto         misura1      misura2    misura3      email richiedente
che mi riporta il risultato seguente :
pirelli           195        65      16      
pi...@libero.it
 ; 
coni...@virgilio.it
 ; 
pl...@tiscali.it
michelin       205      45      17       
zio...@libero.it
 ; 
supe...@zizi.it
non dovrei piu impazzire in quanto faccio una ricerca per ogni tipo di prodotto ed invio agli indirizzi email che l'hanno richiesto.
Qualcuno mi sa aiutare a fare una cosa simile?
Una volta inviato il listino, come posso fare per segnare in corrispondenza di ogni richiesta che non e piu da fare in quanto gia processato?
Dovrei mettere un campo fatto ed impostargli un valore quando ho inviato .
E nella mia query dovrei dire di farmi vedere solo quelli che hanno il campo fatto con valore = no
Spero qualcuno possa aiutarmi.
Ringrazio fin d'ora.
Maroso Marco.

 Maroso Marco.
dovresti dirci com'è fatto il database ma comunque
ammettendo che l'accoppiata misura/marca sia univoca puoi vedere la
lista che dici te con qualcosa del tipo
select email from lista_richiedenti where produttore='pirelli' and
battistrada='195' and spalla='55' and raggio='15'
poi cicli tutto con un foreach e ti stampi la prima riga di una
tabella con "pirelli 195/55 R15" e sotto una riga per ogni record
ritornato dalla query.
tecnicamente dovrebbe funzionare, forse però se posti le specifiche
della struttura del db vien fuori anche meglio

 Maroso Marco.
ho letto ora anche la seconda richiesta....puoi mettere un ulteriore
campo "inviato" di tipo booleano (true o false) che valorizzi quando
spedisci.
in questo caso nella query devi aggiungere ai vari where anche la
condizione inviato<>'1'   (sperando sia giusto sul tuo
db...sinceramente ora sto colla mente su sqlite e li si scrive così la
query)

query)

 Grazie per avermi risposto!
Suggerimento: se vuoi ulteriori risposte regola il quote.


Cosa intendi dire con Regola il quote?

 Cosa intendi dire con Regola il quote?
http://wiki.news.nic.it/QuotarBene


Grazie per la risposta, credo di aver capito.

della struttura del db vien fuori anche meglio
Grazie per avermi risposto!












 Grazie per la risposta, credo di aver capito.
sembra di s�, vediamo su una risposta ad un post pi� articolato :)

 A volte mi capita fare 20 volte la stessa ricerca e di inviarla, e quindi e qui che mi occorre un ragruppamento.
Una soluzione molto veloce che non richiede di scrivere codice 
aggiuntivo ï¿œ quella di ordinare i risultati della query sui tre campi 
che ti interessano.
select * from tabella order by Larghezza,Altezza,Diametro
oppure ancora meglio
select * from tabella order by TipoPneumatico,Larghezza,Altezza,Diametro
in questo modo non avresti *esattamente* quello che chiedi tu ma 
qualcosa che gli si avvicina moltissimo. Infatti con i dati del tuo 
esempio otterresti:
195     |     55       |      15         |        
m...@libero.it
;
195     |     55       |      15         |        
d...@libero.it
;
195     |     55       |      15         |        
e...@libero.it
;
195     |     65       |      15         |        
c...@libero.it
;
195     |     65       |      15         |        
f...@libero.it
;
205     |     45       |      17         |        
b...@libero.it
;
205     |     45       |      17         |        
a...@libero.it
;
ciao
Mauro

 faccia ottenere un lista di questo tipo
Tieni conto che l'argomento non c'entra nulla con PHP, a intuito ti 
suggerisco di cercare l'opzione "GROUP BY" di SQL per raggruppare i 
risultati di una query ma se non ricordo male non è possibile ottenere 
quello che chiedi, cioè la concatenazione di uno dei campi.
Invece tramite php è certamente possibile con uno o più cicli nidificati.

 quello che chiedi, cioè la concatenazione di uno dei campi.
Ricordi male: GROUP_CONCAT
	Y.

 Ricordi male: GROUP_CONCAT
In realtà mi sembra di ricordare bene e che il libro su cui ho studiato 
non lo nominasse. GROUP_CONCAT è presente in SQL-92?
Ad ogni modo con questo l'OP dovrebbe risolvere direttamente nella query.

 non lo nominasse. GROUP_CONCAT è presente in SQL-92?
Direi di no, ma mi pare che l'OP parlasse di un database MySQL.


Grazie!
Si avvicina alla soluzione, ma non e possibile avere tutti gli indirizzi email delle persone che vogliono quel tipo di misure, su un 'unica riga?
Ho visto che nelle altre risposte parlano di un comando concat. Che cos'e?
Grazie a tutti per l'aiuto che mi state dando.
Maroso Marco.

continuo i post precedenti... chiedo cortesemente cosa c'e di non corretto, visto che mi da il seguente errore:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\testdbphp2\lista.php on line 41
Il mio codice e il seguente :
$con = mysql_connect(localhost,$username,$password);
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db($database, $con);
$result = mysql_query("SELECT * FROM test order by larghezza,altezza,diametro and where inviato<>1" );
echo "<table border='1'>
<tr>
<th>Tipo</th>
<th>Larghezza</th>
<th>Serie</th>
<th>Diametro</th>
<th>Speed</th>
<th>Marca</th>
<th>Email</th>
<th>Note</th>
</tr>";
while($row = mysql_fetch_array($result))
  {
  echo "<tr>";
  echo "<td>" . $row['tipo'] . "</td>";
  echo "<td>" . $row['larghezza'] . "</td>";
  echo "<td>" . $row['altezza'] . "</td>";
  echo "<td>" . $row['diametro'] . "</td>";
  echo "<td>" . $row['speed'] . "</td>";
  echo "<td>" . $row['marca'] . "</td>";
  echo "<td>" . $row['email'] . "</td>";
  echo "<td>" . $row['note'] . "</td>"; 
  echo "</tr>";
  }
echo "</table>";
mysql_close($con);
?> 

 Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\testdbphp2\lista.php on line 41
Dal manuale:
http://php.net/manual/en/function.mysql-query.php
mysql_query For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements 
returning resultset, mysql_query() returns a resource on success, or 
FALSE on error.
Ovvero la funzione restituisce una risorsa da passare alla 
mysql_fetch_array solo se va a buon fine.
Se ci sono errori o in ogni caso per qualche motivo fallisce restituisce 
FALSE.
Nel tuo caso la query non sta funzionando e la funzione restituisce il 
booleano FALSE.
La query corretta ï¿œ:
SELECT * FROM test
where inviato<>1
order by larghezza,altezza,diametro
ciao
Mauro


GRAZIE!!! Facendo come mi hai detto ho risolto. Io invece mettevo la condizione alla fine dopo l'ORDER BY ed e per quello che mi dava errore.
Grazie mille.