Dies sollte ziemlich effizient sein:
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;
Berechnen Sie alle Benutzer mit der neuesten Nachricht in der Unterabfrage sub
mit DISTINCT ON
. Dann schließen Sie sich den users
an ein zweites Mal, um den Namen aufzulösen.
Details für DISTINCT ON
:
Erste Zeile in jeder GROUP BY-Gruppe auswählen?
Übrigens:Die Verwendung von "id" und "name" als Spaltennamen ist keine sehr hilfreiche Namenskonvention.