To powinno być dość wydajne:
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;
Oblicz wszystkich użytkowników z najnowszą wiadomością w podzapytaniu sub
przy użyciu DISTINCT ON
. Następnie dołącz do wszystkich users
po raz drugi, aby rozwiązać nazwę.
Szczegóły dla DISTINCT ON
:
Czy wybrać pierwszy wiersz w każdej grupie GROUP BY?
Na marginesie:używanie „id” i „name” jako nazw kolumn nie jest zbyt pomocną konwencją nazewnictwa.