Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql:select max(score) gibt nicht die relevanten Zeilendaten zurück

Sie verwenden MAX , was eine Aggregatfunktion ist. Aggregatfunktionen haben den Effekt, dass mehrere Zeilen in der Tabelle als Gruppe behandelt werden. Wenn Sie nichts Besonderes tun, werden alle Zeilen in der gesamten Tabelle als eine große Gruppe verwendet, und wenn eine aggregierte Funktion wie MAX verwendet wird vorhanden ist, werden alle diese Zeilen zu einer einzigen aggregierten Zeile zusammengefasst. Dieser Verdichtungseffekt wäre auch bei anderen Aggregatfunktionen wie MIN aufgetreten , SUM , GROUP_CONCAT und Freunde (siehe:http://dev. mysql.com/doc/refman/5.1/en/group-by-functions.html ). Sie können auch bestimmte Gruppierungen mit GROUP BY anwenden konstruieren, aber wenn Sie dies nicht tun, bündelt das Auftreten der Aggregatfunktion einfach alle Zeilen in einer Zeile (aber diese Bündelung erfolgt nach Anwendung des WHERE Bedingung, sodass nur die gefilterten Zeilen aggregiert werden)

Nun, wegen dieser kondensierenden oder „reduzierenden“ Wirkung von Aggregatfunktionen gibt es eine Möglichkeit, aus vielen Werten einen Wert zu machen. Für MAX , auf diese Weise wird nur der Maximalwert aufgelistet, der für alle Instanzen des Ausdrucks gefunden wurde, den Sie als Argument an MAX übergeben haben . Ihre anderen Spalten haben jedoch keine solche Aggregatfunktion. Bei den meisten Datenbankprodukten das Vorkommen von sowohl nicht aggregierten als auch aggregierten Spalten in SELECT Liste wäre ein Fehler. Aber MySQL verhält sich falsch/anders und gibt nur einen der verfügbaren Werte für jeden nicht aggregierten Ausdruck zurück, der in SELECT aufgelistet ist Bit. Welcher Wert liegt bei mysql - Sie können sich nicht auf einen bestimmten Algorithmus verlassen.

In vielen Fällen möchten die Leute etwas mit "welcher Zeile auch immer den maximalen Wert hat" machen, mit anderen Worten, die Zeile finden, die als Wert den maximalen Wert hat, aber die anderen Spalten aus dieser Zeile nicht aggregiert verwenden. Die von middaparka bereitgestellte Lösung tut dies, und es gibt auch andere Möglichkeiten, dies zu erreichen (google for MySQL group-wise maximum). Für allgemeinere Informationen zu Aggregatfunktionen und dem zugehörigen GROUP BY Klausel, können Sie sich -shameless selfplug- meinen Artikel hier ansehen:http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html