Nie możemy odwołać się do wyniku funkcji agregującej (na przykład MAX()
) w WHERE
klauzula tego samego SELECT
.
Normatywnym wzorcem rozwiązywania tego typu problemów jest użycie widoku wbudowanego, mniej więcej tak:
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
To tylko jeden sposób na uzyskanie określonego wyniku. Istnieje kilka innych podejść do uzyskania tego samego wyniku, a niektóre z nich mogą być znacznie mniej wydajne niż inne. Inne odpowiedzi pokazują to podejście:
WHERE t.id = (SELECT MAX(id) FROM ... )
Czasami najprostszym podejściem jest użycie ORDER BY z LIMIT. (Zauważ, że ta składnia jest specyficzna dla MySQL)
SELECT t.firstName
, t.Lastname
, t.id
FROM mytable t
ORDER BY t.id DESC
LIMIT 1
Zauważ, że zwróci to tylko jeden wiersz; więc jeśli istnieje więcej niż jeden wiersz z tym samym identyfikatorem, to nie zwróci ich wszystkich. (Pierwsze zapytanie zwróci WSZYSTKIE wiersze, które mają ten sam identyfikator.)
To podejście można rozszerzyć, aby uzyskać więcej niż jeden wiersz, możesz uzyskać pięć wierszy, które mają najwyższe wartości identyfikatora, zmieniając je na LIMIT 5
.
Zauważ, że wydajność tego podejścia jest szczególnie zależna od dostępności odpowiedniego indeksu (np. z id
jako KLUCZ PODSTAWOWY lub jako wiodąca kolumna w innym indeksie). Odpowiedni indeks poprawi wydajność zapytań przy użyciu wszystkich tych podejść.