Vous pourriez
SELECT a.id, a.topic_id
FROM MSG a
WHERE a.id IN (
SELECT t.id
FROM MSG t
WHERE a.topic_id = t.topic_id
ORDER BY t.id DESC
LIMIT 2)
ORDER BY a.topic_id, a.id
EDIT: Comme il semble que MySQL ne permet pas (! Mais il sera possible dans les versions ultérieures) à utiliser LIMIT dans les sous-requêtes ici est une solution généralisée (sans hypothèses de raccourci, sauf que msg.id est unique par topic_id):
SELECT a.id, a.topic_id
FROM MSG a
WHERE a.id IN (
SELECT MAX(t.id)
FROM MSG t
WHERE a.topic_id = t.topic_id
) OR
a.id IN (
SELECT MAX(t.id)
FROM MSG t
WHERE a.topic_id = t.topic_id AND
t.id NOT IN (
SELECT MAX(t2.id)
FROM MSG t2
WHERE t.topic_id = t2.topic_id
)
)
ORDER BY a.topic_id, a.id
bien sûr, ce n'est pas agréable, mais vous y êtes. Si l'on suppose que les ids dans topic_id sont ascendants sans trous, d'autres améliorations peuvent être apportées à la requête.
Y a-t-il des raccourcis que nous pourrions supposer? par exemple, dans les données ci-dessus vos identifiants sont ascendants sans trous et pour les identifiants ascendants, vous avez aussi un topic_id croissant - si nous pouvons supposer que cela rendra la requête plus facile. une autre approche pourrait utiliser l'hypothèse qu'il y a au moins deux entrées pour chaque topic_id. pouvons-nous supposer cela? – Unreason