使用SQL获得最后一个帖子回复

问题描述:

我想通过获取帖子的最后回复来复制论坛功能。使用SQL获得最后一个帖子回复

为了清楚起见,请参阅PHPBB:有四列,最后一列是我喜欢复制的内容。

我有我的表,因为这样产生:

  • discussion_id(主键)
  • USER_ID
  • PARENT_ID
  • 评论
  • 状态
  • pubdate的

我正在考虑创建一个链接表,每次回复帖子时都会更新它。

链接表将如下:

  • discussion_id(主键)
  • last_user_id
  • last_user_update

不过,我希望那里有一个提前查询实现这一目标方法。也就是说,抓住每个家长讨论,并在每个家长讨论中找到最后一个答复。

我说得对,有这样的查询吗?


这里是更新。 我仍然有一点麻烦,但我觉得我快到了。

我当前的查询:

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 

ID 30和ID 33共享相同的PARENT_ID:NULL,但他们是“启动线程”或“父后”

他们不应该不被合并,我将如何继续“分组”,但“忽略”空值?

该查询将采用每个parent_id的最高(因此假设是最新的)讨论。然而没有最巧妙的解决方案......

select discussion_id, user_id, pubdate 
from tablename 
where discussion_id in 
(
    select max(discussion_id) 
    from tablename 
    group by parent_id 
) 
+0

对Parent_Id进行分组时,它也将那些为空的分组。那个空的不是组,因为它们本身就是parent_id。我如何根据parent_id进行分组但忽略空值? – Anraiki 2010-04-11 13:51:57

你想要GROUP BY。这应该工作正常:

SELECT MAX(`pubdate`), `discussion_id`, `user_id` FROM `table` GROUP BY `parent_id` 

您将显然需要填写适当的WHERE子句和LIMIT根据需要。

+2

这将导致错误,指出'discussion_id'和'user_id'必须包含在聚合或组合中。 – F* 2010-03-24 07:27:37

+1

@F*,不,不.. ..?如果“GROUP BY”条款不在那里,那么它会。 – jasonbar 2010-03-24 07:30:02

+1

@jasonbar F*的正确!您需要将'discussion_id','user_id'放在GROUP BY中或者将它们聚合。 – 2010-03-24 09:40:04

你可以尝试这样的事:当你有最高的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 

左侧加入到讨论C的温度将不匹配,这应成为你想要的行。