我有两张桌子:
items:
| item_id | title |
comments:
| comment_id | item_id | posted_at | author_id | text |
posted_at
是评论发布的时间。
如何获取所有项目的列表,包括上次评论的每个项目的时间以及最后评论的author_id?
答案 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并添加其他列。