sql >> Database >  >> RDS >> Mysql

mysql:select max(score) retourneert niet de relevante rijgegevens

Je gebruikt MAX , wat een geaggregeerde functie is. Geaggregeerde functies hebben tot gevolg dat meerdere rijen in de tabel als een groep worden behandeld. Als u niets speciaals doet, worden alle rijen in de hele tabel als één grote groep gebruikt en wanneer een aggregatiefunctie zoals MAX is, zullen al deze rijen worden gecondenseerd in slechts één geaggregeerde rij. Dat condenserende effect zou ook zijn opgetreden voor andere geaggregeerde functies zoals MIN , SUM , GROUP_CONCAT en vrienden (zie:http://dev. mysql.com/doc/refman/5.1/en/group-by-functions.html ). U kunt ook specifieke groeperingen toepassen met behulp van de GROUP BY constructie, maar als u dat niet doet, zal het voorkomen van de aggregatiefunctie alle rijen in één rij samenvoegen (maar deze opeenhoping vindt plaats na het toepassen van de WHERE voorwaarde, dus alleen de gefilterde rijen worden geaggregeerd)

Nu, vanwege dit condenserende of 'verminderende' effect van geaggregeerde functies, is er een manier om één waarde uit vele waarden te maken. Voor MAX , op die manier geeft u alleen de maximale waarde weer die is gevonden voor alle instanties van de uitdrukking die u als argument aan MAX hebt doorgegeven . Maar uw andere kolommen hebben niet zo'n aggregatiefunctie. Voor de meeste databaseproducten is het voorkomen van zowel niet-geaggregeerde als geaggregeerde kolommen in de SELECT lijst zou een fout zijn. Maar MySQL gedraagt ​​zich verkeerd/anders en retourneert slechts één van de beschikbare waarden voor elke niet-geaggregeerde expressie die wordt vermeld in de SELECT beetje. Welke waarde is aan mysql - u kunt niet vertrouwen op een bepaald algoritme.

In veel gevallen willen mensen iets doen met "elke rij die de maximale waarde heeft", met andere woorden, zoek de rij die de maximale waarde heeft, maar gebruik de andere kolommen van die rij niet-geaggregeerd. De oplossing van middaparka doet dat, en er zijn ook andere manieren om dat te bereiken (google voor MySQL group-wise maximum). Voor meer algemene informatie over aggregatiefuncties en de gerelateerde GROUP BY clausule, zou je hier -schaamteloze selfplug- mijn artikel kunnen bekijken:http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html



  1. Hoe alle gegevens uit 2 tabellen te halen met behulp van een externe sleutel

  2. Hoe voeg ik indexen toe aan MySQL-tabellen?

  3. Hoe te debuggen postgresql opgeslagen procedures?

  4. Full-text zoekopdracht met een enkele quote