- Du måste ange
ORDER BY
för att definiera någon sortering av raderna. - Jag tror att alla lösningar för MySQL i praktiken skulle innebära att din fråga körs minst två gånger, så det är verkligen bättre att göra det på klienten.
Om du är okej med att köra samma fråga två gånger, gör något så här.
Få ID:t för den sista raden först:
SELECT @LastID := ID
FROM ...
WHERE ...
GROUP BY ...
ORDER BY ID DESC
LIMIT 1;
Använd det ID:t i huvudfrågan:
SELECT *
, CASE WHEN ID = @LastID THEN FALSE ELSE TRUE END AS IsLast
FROM ...
WHERE ...
GROUP BY ...
ORDER BY ID ASC;
Som den är, kommer den troligen att gå sönder om tabellen uppdateras medan dessa två frågor körs (det ihågkomna ID:t kanske inte blir det sista om rader läggs till eller tas bort, om du inte gör något för att lösa problemet).
Naturligtvis kan du lägga allt i en fråga:
SELECT
*,
CASE WHEN ID = LastID THEN FALSE ELSE TRUE END AS IsLast
FROM
YourTable
CROSS JOIN
(
SELECT ID AS LastID
FROM YourTable
ORDER BY ID DESC
LIMIT 1
) AS TableLastID
ORDER BY ID ASC;
Du måste kontrollera om MySQL är smart nog att köra den inre SELECT LIMIT 1
bara en gång, annars körs den för varje rad i huvudtabellen. Ändå, även i bästa fall exekveras frågan effektivt två gånger.