Điều này sẽ khá hiệu quả:
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;
Tính toán cho tất cả người dùng thông báo mới nhất trong truy vấn con sub
sử dụng DISTINCT ON
. Sau đó tham gia users
totable lần thứ hai để giải quyết tên.
Chi tiết về DISTINCT ON
:
Chọn hàng đầu tiên trong mỗi GROUP BY nhóm?
Ngoài ra:Sử dụng "id" và "name" làm tên cột không phải là một quy ước đặt tên hữu ích.