Mysql
 sql >> Database >  >> RDS >> Mysql

mysql:select max(score) non restituisce i dati di riga rilevanti

Stai usando MAX , che è una funzione aggregata. Le funzioni di aggregazione hanno l'effetto di trattare più righe della tabella come un gruppo. Se non fai nulla di speciale, tutte le righe dell'intera tabella verranno utilizzate come un unico grande gruppo e quando una funzione di aggregazione come MAX è presente, tutte queste righe verranno condensate in una sola riga aggregata. Tale effetto condensante si sarebbe verificato anche per altre funzioni aggregate come MIN , SUM , GROUP_CONCAT e amici (vedi:http://dev. mysql.com/doc/refman/5.1/en/group-by-functions.html ). Puoi anche applicare raggruppamenti specifici utilizzando il GROUP BY costrutto, ma se non lo fai l'occorrenza della funzione di aggregazione raggrupperà semplicemente tutte le righe in una riga (ma questo raggruppamento si verifica dopo aver applicato il WHERE condizione, quindi solo le righe filtrate vengono aggregate)

Ora, a causa di questo effetto di condensazione o "riduzione" delle funzioni aggregate, esiste un modo per ricavare un valore da molti valori. Per MAX , in questo modo è elencare solo il valore massimo trovato per tutte le istanze dell'espressione che hai passato come argomento a MAX . Ma le altre tue colonne non hanno una tale funzione aggregata. Per la maggior parte dei prodotti di database, occorrenza di colonne sia non aggregate che aggregate in SELECT lista sarebbe un errore. Ma MySQL si comporta in modo errato/diverso e restituisce solo uno dei valori disponibili per ogni espressione non aggregata elencata in SELECT po. Quale valore dipende da mysql:non puoi fare affidamento su nessun algoritmo particolare.

In molti casi, le persone vogliono fare qualcosa con "qualunque riga abbia il valore massimo", in altre parole, trovare la riga che ha come valore il valore massimo, ma utilizzare le altre colonne di quella riga non aggregate. La soluzione fornita da middaparka lo fa, e ci sono anche altri modi per raggiungere questo obiettivo (google per MySQL massimo in termini di gruppo). Per informazioni più generali sulle funzioni aggregate e il relativo GROUP BY clausola, potresti dare un'occhiata al mio articolo -shameless selfplug- qui:http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html