これはかなり効率的です:
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
を使用する 。次に、totableusers
に参加します 名前を解決するためにもう一度。
DISTINCT ON
の詳細 :
各GROUPBYグループの最初の行を選択しますか?
余談ですが、列名として「id」と「name」を使用することは、あまり役立つ命名規則ではありません。