Това трябва да е доста ефективно:
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;
Изчислете всички потребители с последното съобщение в подзаявката sub
използвайки DISTINCT ON
. След това се присъединете към таблицата users
втори път, за да разрешите името.
Подробности за DISTINCT ON
:
Изберете първия ред във всяка група GROUP BY?
Настрана:Използването на „id“ и „name“ като имена на колони не е много полезна конвенция за именуване.