Mysql 使用SQL获取帖子的最后回复
我试图通过得到一篇文章的最后回复来复制论坛功能 为了清楚起见,请参阅:共有四列,最后一列是我想要复制的 我创建了如下表格:Mysql 使用SQL获取帖子的最后回复,mysql,Mysql,我试图通过得到一篇文章的最后回复来复制论坛功能 为了清楚起见,请参阅:共有四列,最后一列是我想要复制的 我创建了如下表格: 讨论id(主键) 用户id 家长id 评论 地位 出版日期 我想创建一个链接表,每次回复帖子时都会更新 链接表如下所示: 讨论id(主键) 最后用户id 上次用户更新 然而,我希望有一个预先查询来实现这个方法。也就是说,抓取每个家长讨论,并在每个家长讨论中找到最后一个答复 有这样的疑问,我说得对吗 这里有一个更新。 我仍然有一点小麻烦,但我感觉我快到了 我当前的查
- 讨论id(主键)
- 用户id
- 家长id
- 评论
- 地位
- 出版日期
- 讨论id(主键)
- 最后用户id
- 上次用户更新
这里有一个更新。 我仍然有一点小麻烦,但我感觉我快到了 我当前的查询:
SELECT
`discussion_id`,
`parent_id`,
`user_id` as `last_user_id`,
`user_name` as `last_user_name`
FROM `table1`, `table2`
WHERE `table1`.`id` = `table2`.`user_id`
结果:
discussion_id---------parent_id-----last_user_id-------last_user_name
30---------------------NULL-------------3--------------raiku
31---------------------30---------------2--------------antu
32---------------------30---------------1--------------admin
33---------------------NULL-------------3--------------raiku
添加以下内容:
GROUP BY `parent_id`
把它变成:
discussion_id---------parent_id-----last_user_id-------last_user_name
32---------------------30---------------1--------------admin
33---------------------NULL-------------3--------------raiku
但我想把它变成:
discussion_id---------parent_id-----last_user_id-------last_user_name
30---------------------NULL-------------3--------------raiku
32---------------------30---------------1--------------admin
33---------------------NULL-------------3--------------raiku
ID30和ID33共享相同的父线程Id:NULL,但它们是“起始线程”或“父帖子”
它们不应该组合在一起,我如何通过“分组”而不是“忽略”空值来继续呢。这应该可以解决问题:
SELECT MAX(`pubdate`), `discussion_id`, `user_id` FROM `table` GROUP BY `parent_id`
显然,您需要根据需要填写适当的WHERE子句和限制。您需要。这应该可以解决问题:
SELECT MAX(`pubdate`), `discussion_id`, `user_id` FROM `table` GROUP BY `parent_id`
显然,您需要根据需要填写适当的WHERE子句和限制。此查询将对每个家长id进行最高(因此假设为最新)的讨论。但不是最简单的解决方案
select discussion_id, user_id, pubdate
from tablename
where discussion_id in
(
select max(discussion_id)
from tablename
group by parent_id
)
此查询将采用每个家长id的最高(因此假设为最新)讨论。但不是最整洁的解决方案
select discussion_id, user_id, pubdate
from tablename
where discussion_id in
(
select max(discussion_id)
from tablename
group by parent_id
)
您可以尝试以下方法:
SELECT parent.discussion_id,
child.discussion_id as last_discussion_id,
child.user_id as last_user_id,
child.pubdate as last_user_update
FROM Discussion parent
INNER JOIN Discussion child ON ( child.parent_id = parent.discussion_id )
LEFT OUTER JOIN Discussion c ON ( c.parent_id = parent.discussion_id AND c.discussion_id > child.discussion_id)
WHERE c.discussion_id IS NULL
当您有id最高的帖子时,讨论c的左连接将不匹配,该帖子应该是您想要的行 您可以尝试以下方法:
SELECT parent.discussion_id,
child.discussion_id as last_discussion_id,
child.user_id as last_user_id,
child.pubdate as last_user_update
FROM Discussion parent
INNER JOIN Discussion child ON ( child.parent_id = parent.discussion_id )
LEFT OUTER JOIN Discussion c ON ( c.parent_id = parent.discussion_id AND c.discussion_id > child.discussion_id)
WHERE c.discussion_id IS NULL
当您有id最高的帖子时,讨论c的左连接将不匹配,该帖子应该是您想要的行 这将导致一个错误,指出“讨论id”和“用户id”必须包含在聚合或组中。@Fabian,不,它不。。?如果
GROUPBY
子句不存在,那么它就会存在。@jasonbar Fabian是正确的!您需要将discussion\u id
、user\u id
放入分组中,或者将它们聚合在一起。我认为mysql(与其他数据库不同)确实允许您运行该查询。但我认为,对于非聚合列,您可能会得到多个可能的值,因此结果不一定是正确的correct@Martin史密斯,你真的试过运行类似的查询吗?它可以正常工作。这将导致一个错误,说明“讨论id”和“用户id”必须包含在聚合或分组中。@Fabian,不,它没有。。?如果GROUPBY
子句不存在,那么它就会存在。@jasonbar Fabian是正确的!您需要将discussion\u id
、user\u id
放入分组中,或者将它们聚合在一起。我认为mysql(与其他数据库不同)确实允许您运行该查询。但我认为,对于非聚合列,您可能会得到多个可能的值,因此结果不一定是正确的correct@Martin史密斯,你真的试过运行类似的查询吗?它工作得很好。在对父\u Id进行分组时,它也会对空的进行分组。空的一个不被认为是组,因为它们本身就是父id。如何按父\u id进行分组而忽略空值?在对父\u id进行分组时,它还会对空值进行分组。空的一个不被认为是组,因为它们本身就是父id。如何按父\u id分组,但忽略空值?