2009-06-01 44 views
6

我有評論回覆(只有一個級別)的功能。所有評論可以有多達答覆,但沒有答覆可以有他們的進一步答覆。如何在MYSQL中進行評論回覆查詢?

所以我的數據庫表結構是像下面

Id ParentId Comment 
1  0   this is come sample comment text 
2  0   this is come sample comment text 
3  0   this is come sample comment text 
4  1   this is come sample comment text 
5  0   this is come sample comment text 
6  3   this is come sample comment text 
7  1   this is come sample comment text 

在上述結構中,commentid,1(有2個回覆)和3(1回覆)具有回覆。因此,要獲取評論和他們的回覆,一個簡單的方法是首先獲取ParentId爲0的所有註釋,然後通過運行while循環獲取該特定commentId的所有回覆。但是,如果我在特定記錄上有大約200條評論,那麼這似乎正在運行數百個查詢。

所以我想做一個查詢,它將按順序獲取評論與他們的答覆,如下所示;

Id ParentId Comment 
1  0   this is come sample comment text 
4  1   this is come sample comment text 
7  1   this is come sample comment text 
2  0   this is come sample comment text 
3  0   this is come sample comment text 
6  3   this is come sample comment text  
5  0   this is come sample comment text 

我也有我的評語表評論日期列,如果有人想與評論的查詢使用。

所以最後我想通過使用一個單一的mysql查詢獲取所有的評論和他們的答覆。請告訴我我該怎麼做?

謝謝

回答

15

您可以在ORDER BY中使用表達式。試試這個:

SELECT * 
FROM comments 
ORDER BY IF(ParentId = 0, Id, ParentId), Id 

這將首先按Id,如果ParentId = 0,或ParentId否則排序。第二種排序標準是Id,以確保答覆按順序返回。

+0

不錯,我想知道如何做到這一點。:) – 2009-06-02 00:37:09

1

我強烈建議您重構您的數據庫架構。主要的問題是你試圖把註釋和回覆視爲同一件事,而他們簡單的事情並不是一回事。這迫使你做出一些困難的查詢。假設有兩個表:[COMMENTS:(id,text)]和對另一個表[REPLIES(id,commentid,text)]中的註釋的回覆。這個問題看起來好多了,用這種方式思考時就容易多了。

+0

目前不可能改變整個表格結構,我們必須跟上現狀。 – Prashant 2009-06-02 04:31:58

+0

我認爲通過利用自我加入,我們可以做到這一點,但我怎麼沒有得到確切的? – Prashant 2009-06-02 04:32:25

-2

如果你/某人正在尋找簡單的解決方案,那麼它可能是有用的。

結構變化 - 我想你已經通過添加博客ID來改變它,如果沒有博客ID,你怎麼說哪些評論是特定於博客?

首先做到這一點,不會損害任何東西到你的數據庫,

update `tblcomments` set ParentId=Id where ParentId=0; 

然後獲得以該博客的評論和意見回覆(評論 - 回覆1,回覆2 ...在註釋)

使用bleow查詢

SELECT * 
FROM tblcomments 
ORDER BY ParentId ASC; 

乾杯, -PM。