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

标签 sql mysql database

我问过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 的用法:这是为了使索引可用。

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

关于sql - 从具有非唯一外键的表中选择 N 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/786047/

相关文章:

Java,代码有效,但仍然抛出异常

javascript - XHR 更新失败,字符串包含 "#",其中表单发布成功

mysql - #1054-mysql 中 'userid' 中的未知列 'field list'。当我通过 xampp 在 mysql 中导入包含此表的文件时出现错误

php - 关于为每个客户存储照片以便他们可以访问的解决方案的建议

sql - SQL Server 2012 是否有延迟连接

android - 它不会写超过 3 个表

MySQL - 仅获取特定 parent 的 child

mysql - 展平两个表并使用 group by

mysql - 使用sql联合子查询的组合来处理AND/OR条件的组合以进行客户过滤

javascript - Phonegap & Jquery - 自定义进度条