- Você precisa especificar
ORDER BY
para definir alguma classificação das linhas. - Acredito que qualquer solução para MySQL significaria efetivamente que sua consulta seria executada pelo menos duas vezes, então é realmente melhor fazê-lo no cliente.
Se você estiver OK em executar a mesma consulta duas vezes, faça algo assim.
Obtenha o ID da última linha primeiro:
SELECT @LastID := ID
FROM ...
WHERE ...
GROUP BY ...
ORDER BY ID DESC
LIMIT 1;
Use esse ID na consulta principal:
SELECT *
, CASE WHEN ID = @LastID THEN FALSE ELSE TRUE END AS IsLast
FROM ...
WHERE ...
GROUP BY ...
ORDER BY ID ASC;
Como está, provavelmente ele será interrompido se a tabela for atualizada enquanto essas duas consultas forem executadas (o ID lembrado pode não se tornar o último se as linhas forem adicionadas ou excluídas, a menos que você faça algo para resolver esse problema).
Claro, você pode colocar tudo em uma consulta:
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;
Você precisa verificar se o MySQL é inteligente o suficiente para executar o
SELECT LIMIT 1
interno apenas uma vez ou irá executá-lo para cada linha da tabela principal. Ainda assim, mesmo no melhor caso, a consulta é efetivamente executada duas vezes.