Nemůžeme odkazovat na výsledek agregační funkce (například MAX()
) v WHERE
klauzule stejného SELECT
.
Normativním vzorem pro řešení tohoto typu problému je použití inline pohledu, něco takového:
SELECT t.firstName
, t.Lastname
, t.id
FROM mytable t
JOIN ( SELECT MAX(mx.id) AS max_id
FROM mytable mx
) m
ON m.max_id = t.id
Toto je jen jeden způsob, jak dosáhnout zadaného výsledku. Existuje několik dalších přístupů, jak dosáhnout stejného výsledku, a některé z nich mohou být mnohem méně účinné než jiné. Další odpovědi demonstrují tento přístup:
WHERE t.id = (SELECT MAX(id) FROM ... )
Někdy je nejjednodušším přístupem použít ORDER BY s LIMIT. (Všimněte si, že tato syntaxe je specifická pro MySQL)
SELECT t.firstName
, t.Lastname
, t.id
FROM mytable t
ORDER BY t.id DESC
LIMIT 1
Všimněte si, že to vrátí pouze jeden řádek; takže pokud existuje více než jeden řádek se stejnou hodnotou id, nevrátí je všechny. (První dotaz vrátí VŠECHNY řádky, které mají stejnou hodnotu id.)
Tento přístup lze rozšířit tak, aby získal více než jeden řádek. Pět řádků, které mají nejvyšší hodnoty id, můžete získat změnou na LIMIT 5
.
Všimněte si, že výkon tohoto přístupu závisí zejména na dostupnosti vhodného indexu (tj. s id
jako PRIMÁRNÍ KLÍČ nebo jako úvodní sloupec v jiném indexu.) Vhodný index zlepší výkon dotazů pomocí všech těchto přístupů.