Pokud seskupujete podle jednoho (nebo více) sloupců, musíte udělat něco se všemi neseskupenými sloupci, aby váš dotaz dával smysl.
Musíte říci, co chcete udělat se všemi seskupenými hodnotami. Obvykle něco jako SUM(), AVG(), MIN(), MAX(), GROUP_CONCAT()
Pokud seskupujete podle m_from, pak nebudete moci řadit podle m_time, protože všechny záznamy pro m_from budou seskupeny a pro neseskupené hodnoty dostanete libovolnou odpověď, protože jste určit, co se skupinou má dělat.
Pravděpodobně budete chtít použít agregační funkci, jako je MAX(m_time), abyste získali nejvyšší hodnotu pro m_time, a pak podle ní seřadit.
Navrhoval bych něco jako.
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;