Questo dovrebbe essere piuttosto efficiente:
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;
Calcola tutti gli utenti con l'ultimo messaggio nella sottoquery sub
utilizzando DISTINCT ON
. Quindi unisciti a users
atable una seconda volta per risolvere il nome.
Dettagli per DISTINCT ON
:
Seleziona la prima riga in ogni gruppo GROUP BY?
A parte:l'uso di "id" e "name" come nomi di colonna non è una convenzione di denominazione molto utile.