Newsgroup: it.comp.www.php
Titolo: [HELP] problema con query mysql... cosa usare tra DISTINC, GROUP BY, o altro?

Ciao,
da una tabella come questa:
anno | id | utente | ecc......
1988 | 2 | mio | ....
1989 | 4 | tuo | ....
1989 | 2 | mio | ....
1991 | 4 | tuo | ....
1992 | 5 | suo | ....
facendo una query del tipo:
SELECT * FROM tabella GROUP BY id
ottengo
1988 | 2 | mio | ....
1989 | 4 | tuo | ....
1992 | 5 | suo | ....
quando in realtà a me servirebbe:
1989 | 2 | mio | ....
1991 | 4 | tuo | ....
1992 | 5 | suo | ....
ovvero mi serve l'ultimo record e non il primo in ordine di tempo
aggiungendo ASC o DESC dopo GROUP BY nn risolve il problema!
qualche aiuto suggerimento???
inifinte grazie!

SELECT  MAX(`anno`),`id`,`utente`


 GROUP  BY id
Il bello di questa query è che e' sbagliata secondo la semantica di GROUP BY
(utente non puo' far parte della select list non essendo ne' una funzione
aggregata ne' un campo indicato nel GROUP BY) ma funziona...
In quella corretta ci andrebbe
GROUP BY id, utente

funziona perche id e utente sono strettamente relazionati questo la fa
funzionare, semnticamente se no no avrebbe avuto senso

1992 | 5 | suo | ....
In teoria non dovresti ottenere niente, perche' come fa a darti "1988" con
id=2, anziche' "1989"? Questo ti funzionera' forse solo su MySQL.
Per ogni campo che vuoi ottenere, devi dire al server DB come scegliere il
valore in funzione della GROUP BY:
SELECT MAX(anno) AS anno, id, MAX(utente) ...
Ma anche cosi' non hai qualcosa di portabile perche' dai due record
1988 2	zeta
1989 2	alfa
tu otterresti il record inesistente
1989 2	zeta
Per esempio:
===========
mysql> CREATE TABLE pippo ( anno integer, id integer, controllo integer );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO pippo VALUES ( 1980, 2, 1980 );
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO pippo VALUES ( 1981, 2, 1981 );
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO pippo VALUES ( 1982, 2, 1982 );
Query OK, 1 row affected (0.00 sec)
mysql> SELECT MAX(anno) AS anno, id, controllo FROM pippo GROUP BY id;
+------+------+-----------+
| anno | id   | controllo |
+------+------+-----------+
| 1982 |    2 |      1980 |
+------+------+-----------+
1 row in set (0.00 sec)
Come vedi, la query *SEMBRA* funzionare... ma ti ritorna dati sbagliati.
Qui si vede bene perche' ho inserito "controllo" uguale ad "anno"... ma se
tu avessi qualche altro tipo di dato, forse non te ne accorgeresti subito.
===========
La subquery non ti serve se non hai la garanzia di avere un solo record in
concomitanza dell'anno desiderato (la dimostrazione e' lasciata all'utente
per esercizio <g>).
===
L'unica soluzione portabile credo che sia farlo da programma:
SELECT * FROM tabella ORDER BY id, anno DESC;
Cosi' prelevi (ahitu) tutti i record, dopodiche' ti modifichi un eventuale
ciclo while:
	while($record = SQLFetchNextTuple($exec))
in
	$startId	= -1;	// Valore che sia certamente illegale
	while($record = SQLFetchNextTuple($exec))
	{
		if ($startId == $record['id'])
			continue;
		$startId = $record['id'];
		...
E' un po' macchinoso e trasferisce il costo computazionale al PHP, che non
e' altrettanto ben equipaggiato del server DB, ma credo sia l'unica.
Leonardo
-- 
Avere studiato senza mettere in pratica e' inutile;
mettere in pratica senza avere studiato e' pericoloso.
                                                - Conphpucio

> funziona perche id e utente sono strettamente relazionati
Si', ma (secondo lo standard SQL) andrebbe esplicitato nel group by.