- Vous devez spécifier
ORDER BY
pour définir un tri des lignes. - Je crois que toute solution pour MySQL signifierait effectivement que votre requête est exécutée au moins deux fois, il est donc vraiment préférable de le faire sur le client.
Si vous êtes d'accord pour exécuter la même requête deux fois, faites quelque chose comme ça.
Obtenez d'abord l'ID de la dernière ligne :
SELECT @LastID := ID
FROM ...
WHERE ...
GROUP BY ...
ORDER BY ID DESC
LIMIT 1;
Utilisez cet ID dans la requête principale :
SELECT *
, CASE WHEN ID = @LastID THEN FALSE ELSE TRUE END AS IsLast
FROM ...
WHERE ...
GROUP BY ...
ORDER BY ID ASC;
En l'état, il est fort probable qu'il se cassera si la table est mise à jour pendant l'exécution de ces deux requêtes (l'ID mémorisé peut ne pas être le dernier si des lignes sont ajoutées ou supprimées, à moins que vous ne fassiez quelque chose pour résoudre ce problème).
Bien sûr, vous pouvez tout mettre en une seule requête :
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;
Vous devez vérifier si MySQL est assez intelligent pour exécuter le SELECT LIMIT 1
interne une seule fois ou il l'exécutera pour chaque ligne de la table principale. Pourtant, même dans le meilleur des cas, la requête est effectivement exécutée deux fois.