Si vous regroupez par une (ou plusieurs) colonne(s), vous devez faire quelque chose pour toutes les colonnes non groupées pour que votre requête ait un sens.
Vous devez dire ce que vous voulez faire avec toutes les valeurs groupées. Habituellement quelque chose comme SUM(), AVG(), MIN(), MAX(), GROUP_CONCAT()
Si vous regroupez par m_from, vous ne pourrez pas trier par m_time, car tous les enregistrements pour m_from seront regroupés, et pour les valeurs non regroupées, vous obtiendrez une réponse arbitraire, puisque vous n'avez pas spécifier quoi faire avec le groupe.
Vous souhaitez probablement utiliser une fonction d'agrégation, telle que MAX(m_time) pour obtenir la valeur la plus élevée pour m_time, puis effectuer un tri sur cette base.
Je suggérerais quelque chose comme.
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;