Usted podría
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: Como parece que MySQL no permite (! Sin embargo, que va a ser posible en futuras versiones) para limitar el uso de subconsultas aquí es una solución generalizada (sin supuestos de acceso directo, excepto que msg.id es único por 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
por supuesto esto no es agradable, pero no es usted. Si se puede suponer que los id en topic_id son ascendentes sin agujeros, se pueden realizar mejoras adicionales a la consulta.
¿hay atajos que podamos suponer? por ejemplo, en los datos anteriores, los ID están ascendiendo sin agujeros y para los ID ascendentes también tiene un topic_id ascendente, si podemos suponer que facilitará la consulta. otro enfoque podría usar la suposición de que hay al menos dos entradas para cada topic_id. podemos suponer eso? – Unreason