【问题标题】:Get the row with the latest date in a group?获取组中具有最新日期的行?
【发布时间】:2015-02-25 19:18:24
【问题描述】:

我有两张桌子:

items:
| item_id | title |

comments:
| comment_id | item_id | posted_at | author_id | text |

posted_at 是发表评论的时间。

如何获取所有项目的列表,以及每个项目的最后评论时间和最后评论的 author_id?

【问题讨论】:

  • 但是您的表格中没有时间列
  • @Begueradj 它的posted_at
  • 好的,所以你想要这样的表格结果:item_id|posted_at| author_id?

标签: mysql sql datetime time-series aggregate-functions


【解决方案1】:

您需要每个项目的最新评论。这分为三个部分。

第一个:最近的

SELECT  MAX(comment_id) FROM comments GROUP BY item_id

第二:最近的评论

SELECT comments.author_id, comments.posted_at
  FROM comments
 WHERE comments.comment_id IN 
     (SELECT  MAX(comment_id) FROM comments GROUP BY item_id)

第三。每个项目的最新评论。

SELECT items.item_id, items.title, comments.author_id, comments.posted_at
  FROM items
  LEFT JOIN comments
          ON items.item_id = comments.item_id
         AND comments.comment_id IN 
                 (SELECT  MAX(comment_id) FROM comments GROUP BY item_id)

这里的诀窍是找到每个项目的最新评论,然后使用它。左连接操作保留那些没有 cmets 的项目。此查询使用comment_id 作为代理来搜索最新的posted_at。它假定comment_id 是一个自增列,并且后期的 cmets 具有比早期的 cmets 更高的 comment_id 值。

(item_id, comment_id) 上 cmets 表上的复合索引将通过加速 GROUP BY 子查询来提高性能。

【讨论】:

  • 是的,你是对的......我删除了我的答案并支持你的答案。谢谢
  • 如果项目列表以某种方式限制为具有某些指定属性的项目,如何优化此请求以不获取不需要项目的 cmets 数据?是否应该这样优化,它会提供更好的性能吗?
【解决方案2】:

为此,如果您只需要“item_id”,则不一定需要“items”表。

首先编写一个查询,获取每个 item_id 的最新评论时间,如下所示:

SELECT item_id, MAX(posted_at) AS latestComment
FROM comments
GROUP BY item_id;

现在,您可以在 item_id 和 latestComment 列匹配的条件下将其与您的 cmets 表连接,以获得每个项目的最新评论作者:

SELECT c.item_id, c.author_id, c.posted_at
FROM comments c
JOIN(
   SELECT item_id, MAX(posted_at) AS latestComment
   FROM comments
   GROUP BY item_id) temp ON temp.item_id = c.item_id AND temp.latestComment = c.posted_at;

如果您确实需要来自 items 表的任何信息,您可以使用 item_id 列将上述查询连接到 items 表以获得您需要的信息。

编辑

如果您想为项目添加要求,您可以加入上表,并将它们放在 WHERE 子句甚至是加入的 ON 语句中,如下所示:

SELECT c.item_id, c.author_id, c.posted_at
FROM comments c
JOIN items i ON i.item_id = c.item_id AND i.title LIKE '%Apple%'
JOIN(
   SELECT item_id, MAX(posted_at) AS latestComment
   FROM comments
   GROUP BY item_id) temp ON temp.item_id = c.item_id AND temp.latestComment = c.posted_at;

我只是提出了一个示例要求。此查询应提取标题包含“Apple”一词的所有项目的最新评论。请注意,这是一个内部连接,因此您只会看到具有 cmets 的项目。如果您想查看所有项,我建议使用外连接。

【讨论】:

  • 如果项目列表以某种方式限制为具有某些指定属性的项目,如何优化此请求以不获取不需要项目的 cmets 数据?是否应该这样优化,它会提供更好的性能吗?
  • @MikhailBatcer 诚然,我不是性能专家。请参阅我的编辑以了解如何限制项目。我的建议是先尝试查询。如果效果不好,我们可以从那里拿走。
【解决方案3】:

怎么样;

    Select  title,author_id,MAX(posted_at) as LastTime From items i
    join comments c
    on c.item_id = i.item_id
    group by title,author_id

如果同一个帖子多次存在,这应该会为您提供所需的内容。如果没有,您甚至可以删除 MAX 并添加其他列。

【讨论】:

    【解决方案4】:

    您可以尝试使用max(posted_at) group by item_id 并在这两列上将它与您的 cmets 表连接起来。

    【讨论】:

      猜你喜欢
      • 2021-02-04
      • 1970-01-01
      • 2020-08-12
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多