Cela devrait être plutôt efficace :
SELECT u.name, sub.*
FROM (
SELECT DISTINCT ON (1)
m.message_from AS user_id
, m.message AS last_message
FROM users u
JOIN messages m ON m.message_to = u.id
WHERE u.name = 'Paul' -- must be unique
ORDER BY 1, m.id DESC
) sub
JOIN users u ON sub.user_id = u.id;
Calcule tous les utilisateurs avec le dernier message dans la sous-requête sub
en utilisant DISTINCT ON
. Rejoignez ensuite la table users
une deuxième fois pour résoudre le nom.
Détails pour DISTINCT ON
:
Sélectionner la première ligne de chaque groupe GROUP BY ?
À part :Utiliser "id" et "name" comme noms de colonne n'est pas une convention de dénomination très utile.