我问过similar question在此之前,虽然我得到的答案非常精彩,但我可能需要澄清一下。
就像 This question我想根据列中的值返回 N 行。
我的例子是我有一个博客,我想在其中显示我的帖子以及评论预览。准确地说是最后三个评论。
我的帖子有我需要的内容,但我正在绞尽脑汁地想得到正确的评论。评论表有一个外键 post_id ,显然一条帖子可以附加多个评论,所以如果一篇帖子有 20 条评论,那么我只想返回最后 3 条评论。让这件事变得有些棘手的是,我想在一个查询中完成它,而不是每个博客文章的“限制 3”查询,这使得渲染一个包含大量帖子的页面非常查询繁重。
SELECT *
FROM replies
GROUP BY post_id
HAVING COUNT( post_id ) <=3
此查询执行了我想要的操作,但仅返回每个评论之一,而不是三个。
最佳答案
SELECT l.*
FROM (
SELECT post_id,
COALESCE(
(
SELECT id
FROM replies li
WHERE li.post_id = dlo.post_id
ORDER BY
li.post_id, li.id
LIMIT 2, 1
), CAST(0xFFFFFFFF AS DECIMAL)) AS mid
FROM (
SELECT DISTINCT post_id
FROM replies dl
) dlo
) lo, replies l
WHERE l.replies >= lo.replies
AND l.replies <= lo.replies
AND l.id <= lo.mid
在replies (post_id, id)
上有索引(按此顺序)将大大改善此查询。
注意 l.replies >= lo.replies AND l.replies <= lo.replies
的用法:这是为了使索引可用。
有关详细信息,请参阅我的博客中的文章:
- Advanced row sampling (如何从表中为每个
N
选择GROUP
行)
关于sql - 从具有非唯一外键的表中选择 N 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/786047/