2011-03-07 21 views
1

我正在寫一個腳本來處理評論類似Facebook的狀態/回覆。基本上,一個項目可以有評論,用戶可以回覆該評論(最高一級)。PHP/MySql選擇評論與回覆分組

我的表設置如下:

Comments: [ Comment_ID | User_ID | Content | etc...] 
Comments_Reply: [ Comment_ID | Is_Reply_To ] 

因此,如果用戶回覆評論#出現在comments表像一個普通的評論555,隨後還得到了行Comments_Reply與[555 | 新註釋ID]

我如何可以選擇留言,讓他們按以下順序:

[ 555 | .... 
[ New Comment that replies to 555 
[556 | .... 
[557 | .... 

等等...在答覆意見回覆後相繼出現。我正在使用PHP & MySql。

回答

6

好的,我想我現在得到了你想要的。我沒有辦法快速測試這個函數的MYSQL版本,但是SQLite版本工作的很好,根據文檔,MySQL應該工作的很好。雖然可能是更好的方式在MySQL上執行它。

SQLite的:

SELECT a.*, IFNULL(b.Is_Reply_To, a.Comment_ID) as Is_Reply_To FROM Comments a LEFT JOIN Comments_Reply b HAVING(Comment_ID) ORDER BY Is_Reply_To ASC, a.Comment_ID ASC

MySQL的

SELECT a.*, IF(IS NULL(b.Is_Reply_To), a.Comment_ID, b.Is_Reply_To) as Is_Reply_To FROM Comments a LEFT JOIN Comments_Reply b HAVING(Comment_ID) ORDER BY Is_Reply_To ASC, a.Comment_ID ASC

這將產生這些成果爲我上的SQLite。

Comment_ID Is_Reply_to 
1   1 
10   1 
11   1 
2   2 
12   2 
3   3 
13   3 
14   3 
4   4 
5   5 
6   6 
7   7 
8   8 
9   9 
15   15 
+0

完美,非常感謝! – pws5068 2011-03-08 02:02:36

+0

@ pws5068,如果它適合你,請接受答案:) – 2011-03-10 20:19:25

+2

這是如何工作的,因爲LEFT JOIN沒有「ON」語句 – kornesh 2011-08-12 12:43:23

0

嗨,你可以使用下面的查詢

 
$q="select * from comments"; 
$rs=mysql_query($q); 
if($rs && mysql_num_rows($rs)) 
{ 
while($rd=mysql_fetch_object($rs)) 
{ 
    echo($rd->comment_id); 
    $q1="select * from comments_reply where comment_id=".$rd->comment_id; 
    $rs1=mysql_query($q1); 
    if($rs1 && mysql_num_rows($rs1)) 
    { 
    while($rd1=mysql_fetch_object($rs1)) 
    { 
     echo($rd1->comments_id); 
    } 
    } 
} 
} 
+2

有了10,000條評論,您的查詢會哭求幫助。 – TheCarver 2013-08-29 10:35:21