SQL 查询问题 : X has many Y. 获取所有 X 并仅获取每个 X 的最新 Y

标签 sql mysql database join

假设我们有两个表。发布和评论。帖子有很多评论。假装它们有点满,这样每个帖子的评论数量就会有所不同。我想要一个查询来抓取所有帖子,但只抓取每个帖子的最新评论。

我已被定向到连接和子查询,但我无法弄明白。

示例输出:

帖子 1: 评论 4(post1 的最新评论)

帖子2: Comment2(post2 的最新消息)

帖子3: 评论 10(post3 的最新评论)

等...

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

此答案假设您对每条评论都有一个唯一的标识符,并且它的数量在不断增加。也就是说,后面的帖子比前面的帖子有更高的数量。不必顺序,只需要对应输入的顺序即可。

首先,执行一个提取最大评论 ID 的查询,按帖子 ID 分组。

像这样:

SELECT MAX(ID) MaxCommentID, PostID
FROM Comments
GROUP BY PostID

这将为您提供一个帖子 ID 列表,以及每个帖子的最高(最新)评论 ID。

然后你加入这个,为那些 id 从评论中提取其余数据。

SELECT C1.*, C2.PostID
FROM Comments AS C1
     INNER JOIN (
         SELECT MAX(ID) MaxCommentID, PostID
         FROM Comments
         GROUP BY PostID
     ) AS C2 ON C1.CommentID = C2.MaxCommentID

然后,您加入帖子,以获取有关这些帖子的信息。

SELECT C1.*, P.*
FROM Comments AS C1
     INNER JOIN (
         SELECT MAX(ID) MaxCommentID, PostID
         FROM Comments
         GROUP BY PostID
     ) AS C2 ON C1.CommentID = C2.MaxCommentID
     INNER JOIN Posts AS P ON C2.PostID = P.ID

另一种方法根本不使用内部查询的 PostID。首先,为所有唯一帖子选择最大评论 ID,但不要关心哪个帖子,我们知道它们是唯一的。

SELECT MAX(ID) AS MaxCommentID
FROM Comments
GROUP BY PostID

然后执行 IN 子句,以获取这些评论的其余数据:

SELECT C1.*
FROM Comments
WHERE C1.ID IN (
    SELECT MAX(ID) AS MaxCommentID
    FROM Comments
    GROUP BY PostID
)

然后简单地加入帖子:

SELECT C1.*, P.*
FROM Comments AS C1
     INNER JOIN Posts AS P ON C1.PostID = P.ID
WHERE C1.ID IN (
    SELECT MAX(ID) AS MaxCommentID
    FROM Comments
    GROUP BY PostID
)

关于SQL 查询问题 : X has many Y. 获取所有 X 并仅获取每个 X 的最新 Y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/804397/

相关文章:

php - 如果条目存在并且不使用 php 插入,请检查 mysql

php - 使用单选按钮在 php mysql 的管理面板中显示已批准或未批准的用户

sql - 在数据库中存储吉他和弦

c# - 索引 0 为负数或高于行数

SQL 连接前 1 个表

sql - 选择具有混合值的 N 行

mysql - 如何获得特定玩家的排名?

mysql - 根据子节点的数量获取父节点的数量

mysql - 如何在mysql中获取每个视频的所有子类别

mysql - 我的sql代码哪里出了问题?