我曾经问过一个similar question的问题,虽然我得到的答案是惊人的,但我可能需要澄清。
就像This question我想根据列中的值返回n行。
我的例子是我有一个博客,我想在那里显示我的文章和评论预览。最后三条评论是准确的。
我有我的帖子需要,但我绞尽脑汁想得到正确的评论。comments表有一个post_id外键,显然一个post可以附加多个评论,因此如果一个post有20个评论,那么我只想返回最后三个。使这变得有些棘手的是,我想在一个查询中完成,而不是每个博客帖子的“限制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行)

10-07 15:38