Jeśli grupujesz według jednej (lub więcej) kolumn, musisz coś zrobić ze wszystkimi niezgrupowanymi kolumnami, aby zapytanie miało sens.
Musisz powiedzieć, co chcesz zrobić ze wszystkimi zgrupowanymi wartościami. Zwykle coś takiego jak SUM(), AVG(), MIN(), MAX(), GROUP_CONCAT()
Jeśli grupujesz według m_from, nie będziesz mógł sortować według m_time, ponieważ wszystkie rekordy dla m_from zostaną zgrupowane razem, a dla wartości niezgrupowanych otrzymasz arbitralną odpowiedź, ponieważ nie określ, co zrobić z grupą.
Prawdopodobnie chcesz użyć funkcji agregującej, takiej jak MAX(m_time), aby uzyskać najwyższą wartość m_time, a następnie posortować według tego.
Proponuję coś takiego.
SELECT MAX(m_id),m_from, MAX(m_time) as latest FROM messages
WHERE m_to='XXX' OR m_from='XXX'
GROUP BY m_from
ORDER BY latest DESC;