2010-03-24 37 views
1

我想通過獲取帖子的最後回覆來複制論壇功能。使用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,但他們是「啓動線程」或「父後」

他們不應該不被合併,我將如何繼續「分組」,但「忽略」空值?

回答

2

該查詢將採用每個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

-2

你想要GROUP BY。這應該工作正常:

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

您將顯然需要填寫適當的WHERE子句和LIMIT根據需要。

+2

這將導致錯誤,指出'discussion_id'和'user_id'必須包含在聚合或組合中。 – Fabian 2010-03-24 07:27:37

+1

@Fabian,不,不.. ..?如果「GROUP BY」條款不在那裏,那麼它會。 – jasonbar 2010-03-24 07:30:02

+1

@jasonbar Fabian的正確!您需要將'discussion_id','user_id'放在GROUP BY中或者將它們聚合。 – 2010-03-24 09:40:04

1

你可以嘗試這樣的事:當你有最高的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的溫度將不匹配,這應成爲你想要的行。