sql >> Databáze >  >> RDS >> Mysql

mysql:select max(score) nevrací relevantní data řádku

Používáte MAX , což je agregační funkce. Agregační funkce mají za následek, že se s více řádky v tabulce zachází jako se skupinou. Pokud neuděláte nic zvláštního, všechny řádky v celé tabulce budou použity jako jedna velká skupina a při agregaci funkce jako MAX je tam, všechny tyto řádky budou zhuštěny pouze do jednoho agregovaného řádku. Tento kondenzační efekt by nastal i pro další agregační funkce jako MIN , SUM , GROUP_CONCAT a přátelé (viz:http://dev. mysql.com/doc/refman/5.1/en/group-by-functions.html ). Můžete také použít konkrétní seskupení pomocí GROUP BY konstrukt, ale pokud tak neučiníte, výskyt agregační funkce pouze seskupí všechny řádky do jednoho řádku (k tomuto shlukování však dojde po použití WHERE podmínku, takže se agregují pouze filtrované řádky)

Nyní, kvůli tomuto zhušťujícímu nebo „redukujícímu“ účinku agregačních funkcí, existuje nějaký způsob, jak vytvořit jednu hodnotu z mnoha hodnot. Pro MAX , tímto způsobem je vypsat pouze maximální hodnotu nalezenou pro všechny výskyty výrazu, který jste předali jako argument do MAX . Ale vaše ostatní sloupce takovou agregační funkci nemají. U většiny databázových produktů výskyt jak neagregovaných, tak agregovaných sloupců v SELECT seznam by byl chybou. Ale MySQL se chová špatně/odlišně a vrací pouze jednu z dostupných hodnot pro každý neagregovaný výraz uvedený v SELECT bit. Jaká hodnota závisí na mysql – nemůžete se spolehnout na žádný konkrétní algoritmus.

V mnoha případech lidé chtějí něco udělat s „jakýmkoli řádkem, který má maximální hodnotu“, jinými slovy, najít řádek, který má jako hodnotu maximální hodnotu, ale použít ostatní sloupce z tohoto řádku neagregované. Řešení, které poskytuje middaparka, to dělá a existují i ​​​​jiné způsoby, jak toho dosáhnout (google pro MySQL skupinové maximum). Pro obecnější informace o agregačních funkcích a souvisejících GROUP BY klauzule, můžete se podívat na -shameless selfplug- můj článek zde:http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html



  1. Dotaz SQL pro 7denní klouzavý průměr v SQL Server

  2. Jak se interpretuje SQL s rekurzivním příkazem?

  3. Vytvořte úlohu serveru SQL Server automaticky

  4. MySQL load data:Tento příkaz zatím není podporován v připravovaném výpisovém protokolu