Это стандартная проблема.
Обратите внимание, что MySQL позволяет опускать столбцы из предложения GROUP BY, чего нет в стандартном SQL, но вы не получаете детерминированных результатов вообще при использовании MySQL объект.
SELECT *
FROM Messages AS M
JOIN (SELECT To_ID, From_ID, MAX(TimeStamp) AS Most_Recent
FROM Messages
WHERE To_ID = 12345678
GROUP BY From_ID
) AS R
ON R.To_ID = M.To_ID AND R.From_ID = M.From_ID AND R.Most_Recent = M.TimeStamp
WHERE M.To_ID = 12345678
Я добавил фильтр на To_ID
, чтобы соответствовать тому, что у вас есть. Запрос будет работать без него, но будет возвращать гораздо больше данных в целом. Условие не обязательно должно указываться как вложенным запросом, так и внешним запросом (оптимизатор должен автоматически отключать условие), но он не может нанести вреда повторению условия, как показано.