PostgreSQL では、DISTINCT ON
おそらくこの種のクエリに最適なソリューションです。
SELECT DISTINCT ON (a.id)
a.id, a.title, a.text, c.created, c.text
FROM subscriptions s
JOIN articles a ON a.id = s.article_id
JOIN comments c ON c.article_id = a.id
WHERE s.user_id = %d
ORDER BY a.id, c.created DESC
これにより、最新のコメントと関連する追加の列を含む記事が取得されます。この密接に関連する回答
の説明、リンク、およびベンチマーク。
最新の 10 件を取得するには、これをサブクエリでラップします。
SELECT *
FROM (
SELECT DISTINCT ON (a.id)
a.id, a.title, a.text, c.created, c.text
FROM subscriptions s
JOIN articles a ON a.id = s.article_id
JOIN comments c ON c.article_id = a.id
WHERE s.user_id = 12
ORDER BY a.id, c.created DESC
) x
ORDER BY created DESC
LIMIT 10;
または、ウィンドウ関数を standard と組み合わせて使用できますDISTINCT
。
SELECT DISTINCT
a.id, a.title, a.text, c.created, c.text
,first_value(c.created) OVER w AS c_created
,first_value(c.text) OVER w AS c_text
FROM subscriptions s
JOIN articles a ON a.id = s.article_id
JOIN comments c ON c.article_id = a.id
WHERE s.user_id = 12
WINDOW w AS (PARTITION BY c.article_id ORDER BY c.created DESC)
ORDER BY c_created DESC
LIMIT 10;
DISTINCT
(集約関数とは異なり)after
ウィンドウ関数が適用されるため、これは機能します。
どちらが速いかをテストする必要があります。最後の方が遅いと思います。