- Devi specificare
ORDER BY
per definire un ordinamento delle righe. - Credo che qualsiasi soluzione per MySQL significherebbe effettivamente che la tua query viene eseguita almeno due volte, quindi è davvero meglio farlo sul client.
Se sei d'accordo con l'esecuzione della stessa query due volte, fai qualcosa del genere.
Ottieni prima l'ID dell'ultima riga:
SELECT @LastID := ID
FROM ...
WHERE ...
GROUP BY ...
ORDER BY ID DESC
LIMIT 1;
Usa quell'ID nella query principale:
SELECT *
, CASE WHEN ID = @LastID THEN FALSE ELSE TRUE END AS IsLast
FROM ...
WHERE ...
GROUP BY ...
ORDER BY ID ASC;
Così com'è, molto probabilmente si interromperà se la tabella viene aggiornata durante l'esecuzione di queste due query (l'ID ricordato potrebbe non diventare l'ultimo se le righe vengono aggiunte o eliminate, a meno che tu non faccia qualcosa per risolvere questo problema).
Ovviamente puoi mettere tutto in una query:
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;
Devi verificare se MySQL è abbastanza intelligente da eseguire il SELECT LIMIT 1
interno solo una volta o lo eseguirà per ogni riga della tabella principale. Tuttavia, anche nel migliore dei casi, la query viene effettivamente eseguita due volte.