Si potrebbe
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: Come sembra che MySQL non consente (! Ancora sarà possibile nelle prossime versioni) per utilizzare LIMIT in subquery Ecco una soluzione generalizzata (senza ipotesi scorciatoia, solo che msg.id è unico per 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
naturalmente questo non è bello, ma ci siete. Se si assume che gli ID di topic_id siano in ordine crescente senza buchi, è possibile apportare ulteriori miglioramenti alla query.
ci sono scorciatoie che potremmo assumere? per esempio nei dati sopra riportati i tuoi ID stanno salendo senza buchi e per gli ID ascendenti hai anche topic_id crescente - se possiamo assumere che renderà la query più facile. un altro approccio potrebbe usare l'ipotesi che ci siano almeno due voci per ogni topic_id. possiamo supporre che? – Unreason