Se stai raggruppando per una (o più) colonne, devi fare qualcosa per tutte le colonne non raggruppate affinché la tua query abbia un senso.
Devi dire cosa vuoi fare con tutti i valori raggruppati. Di solito qualcosa come SUM(), AVG(), MIN(), MAX(), GROUP_CONCAT()
Se stai raggruppando per m_from, non sarai in grado di ordinare per m_time, poiché tutti i record per m_from verranno raggruppati e per i valori non raggruppati otterrai una risposta arbitraria, poiché non l'hai fatto specificare cosa fare con il gruppo.
Probabilmente vorrai utilizzare una funzione di aggregazione, come MAX(m_time) per ottenere il valore più alto per m_time, e quindi ordinare su quello.
Suggerirei qualcosa del genere.
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;