从具有非唯一外键的表中选择N行

时间:2009-04-24 14:18:40

标签: sql mysql database

我之前已经问过similar question,而我得到的答案很精彩,我可能需要澄清。

就像This question一样,我想根据列中的值返回N行。

我的例子是我有一个博客,我想要显示我的帖子以及评论的预览。最后三条评论确切。

我有我需要的帖子,但我正在绞尽脑汁才能正确评论。注释表有一个post_id的外键,显然可以在一个帖子上附加多条评论,所以如果帖子有20个评论,那么我只想返回最后三个。是什么让这有点棘手的是我想在一个查询中做到这一点而不是每个博客文章的“限制3”查询,这使得渲染一个包含大量帖子的页面非常查询。

SELECT *
FROM replies
GROUP BY post_id
HAVING COUNT( post_id ) <=3

此查询执行我想要的操作,但只返回每个注释中的一个,而不是三个。

3 个答案:

答案 0 :(得分: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的用法:这是为了使索引可用。

有关详细信息,请参阅我博客中的文章:

答案 1 :(得分:0)

您是否跟踪评论日期?您可以对这些结果进行排序,以便仅获取最近的3个结果。

答案 2 :(得分:0)

遵循伊恩雅各布的想法

声明@PostID int

select top 3 post_id, comment
from replies
where post_id=@PostID
order by createdate desc