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