代码之家  ›  专栏  ›  技术社区  ›  Anonymous

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

  •  2
  • Anonymous  · 技术社区  · 17 年前

    我问了一个问题 similar question

    This question 我想根据列中的值返回N行数。

    我的例子是我有一个博客,我想在那里显示我的帖子以及评论的预览。准确地说,最后三条评论。

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

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

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

    3 回复  |  直到 9 年前
        1
  •  3
  •   Quassnoi    17 年前
    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 :这是为了使索引可用。

        2
  •  0
  •   Ian Jacobs    17 年前

        3
  •  0
  •   DForck42    17 年前

    遵循雅可比的思想

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