我有一个非常简单的 PostgreSQL 查询来检索最新的 50 篇新闻文章:
SELECT id, headline, author_name, body
FROM news
ORDER BY publish_date DESC
LIMIT 50
现在我还想检索每篇文章的最新 10 条评论。我可以想到两种方法来完成检索它们,但我不确定哪一种在 PostgreSQL 的上下文中是最好的:
选项1:
直接对原始查询中的注释进行子查询,并将结果转换为数组:
SELECT headline, author_name, body,
ARRAY(
SELECT id, message, author_name,
FROM news_comments
WHERE news_id = n.id
ORDER BY DATE DESC
LIMIT 10
) AS comments
FROM news n
ORDER BY publish_date DESC
LIMIT 50
显然,在这种情况下,应用程序逻辑需要知道数组中的哪个索引是哪个列,这没有问题。
我在该方法中看到的一个问题是不知道查询计划器将如何执行它。这会有效地变成 51 个查询吗?
选项 2:
使用原始的非常简单的查询:
SELECT id, headline, author_name, body
FROM news
ORDER BY publish_date DESC
LIMIT 50
然后通过应用程序逻辑,收集所有新闻 ID 并在单独的查询中使用它们,这里必须使用 row_number() 以限制每篇新闻文章的结果数量:
SELECT *
FROM (
SELECT *,
row_number() OVER(
PARTITION BY author_id
ORDER BY author_id DESC
) AS rn
FROM (
SELECT *
FROM news_comment
WHERE news_id IN(123, 456, 789)
) s
) s
where rn <= 10
这种方法显然更复杂,我不确定这是否必须首先检索范围内新闻文章的所有评论,然后删除行数大于 10 的评论。
哪个选项最好?或者有没有我忽略的更好的解决方案?
就上下文而言,这是我自己开发的一个新闻聚合网站,我目前有大约 40,000 篇不同类别的新闻文章,大约有 500,000 条评论,所以我正在寻找帮助我保持增长的最佳解决方案。