Hello !
Je plussois le fait de ne pas utiliser des mots clés réserver au langage SQL comme nom de table ou de colonne et t'invite si ce n'est déjà fait, à renommer ta colonne "timestamp" en "message_timestamp" ou autre (pas "date", c'est aussi réservé

). Au pire tu peux utiliser les `quotes` spéciale de protection de mysql, mais c'est s'embêter pour rien et ça ne fonctionne de toute façon qu'avec mysql, autant prendre l'habitude de nommer ton champ correctement
Pour l'ordre aléatoire, c'est lié au fait que tu utilises un order by sur une colonne qui n'est pas présente dans le résultat de ta requête (ce qui d'ordinaire n'est pas problématique, sauf que tu utilises group by

). Ton timestamp étant différent pour chaque enregistrement et n'étant pas inclus dans ton group by, MySQL est incapable de savoir lequel utiliser pour trier les résultats.
Pour contourner le problème, tu peux procéder en deux temps avec une sous requête :
SELECT DISTINCT tousername, touserid FROM (
SELECT tousername, touserid, `timestamp`
FROM blabax_messages
WHERE userid = '$uid' AND touserid != 0 AND touserid != userid
ORDER BY `timestamp` DESC
)
(à tester, mais ça devrait faire l'affaire

)
Pas sûr pour autant que les conditions touserid != 0 AND touserid != userid aient un réel intérêt, à toi de voir si on peut poster un message à personne ou à soi-même
A noter qu'il vaut mieux remplacer tes LIKE par un simple = ou != quand tu n'utilises pas de "%" (soit la valeur est égale à, soit elle ne l'est pas, l'instruction like permet de rechercher des chaines partielles avec des jokers). Outre le fait que ça sera plus facile à lire, ça améliorera les performances
