获取组中最新日期的行?

时间:2014-12-29 15:32:21

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

我有两张桌子:

items:
| item_id | title |

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

posted_at是评论发布的时间。

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

4 个答案:

答案 0 :(得分: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)

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

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

答案 1 :(得分:1)

为此,您不一定需要'项目'如果您想要的只是' item_id'。

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

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

现在,您可以在评论表中加入,条件是item_id和latestComment列匹配,以获取每个项目的最新评论作者:

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'”标题的项目提取最新评论。请注意,这是一个内部联接,因此您只能看到有注释的项目。如果您想查看所有项目,我建议您使用外部联接。

答案 2 :(得分:0)

您可以尝试使用max(posted_at) group by item_id并将其与这两列上的评论表一起加入。

答案 3 :(得分:0)

怎么样;

    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并添加其他列。