Isso deve ser bastante eficiente:
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;
Calcular todos os usuários com a mensagem mais recente na subconsulta
sub
usando DISTINCT ON
. Em seguida, junte-se à tabela users
uma segunda vez para resolver o nome. Detalhes para
DISTINCT ON
:Selecione a primeira linha em cada grupo GROUP BY?
À parte:Usar "id" e "name" como nomes de colunas não é uma convenção de nomenclatura muito útil.