Detta borde vara ganska effektivt:
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;
Beräkna alla användare med det senaste meddelandet i underfrågan sub
med DISTINCT ON
. Gå sedan med i totala users
en andra gång för att lösa namnet.
Detaljer för DISTINCT ON
:
Välj första raden i varje GROUP BY-grupp?
Bortsett från:Att använda "id" och "name" som kolumnnamn är inte en särskilt användbar namnkonvention.