2013-03-21 96 views
0

好吧,我意識到有很多方法可以完成評論。我選擇的方式是這樣設置的一張桌子。嵌套評論系統mysql訂購

id comment date  time orig_comment 
1  Hello 03-01-2013 10:10:10  0 
2  Hello 03-02-2013 10:10:10  0 
3  Hello 03-03-2013 10:10:10  1 

因此,要清除有第一級,然後用戶可以回覆該評論(這是唯一的兩個級別)。我給每個唯一遞增的id,並指定orig_comment。如果orig_comment是「0」,那麼它是基本級別的評論,如果它是嵌套的,則orig_comment將是原始評論的ID。夠簡單。所以我當然需要評論。以下是我現在如何做到這一點。

mysql_query("SELECT Comments.* FROM Comments ORDER BY 
IF(Comments.orig_comment = 0, Comments.id, Comments.orig_comment)DESC,Comments.id ASC") 

此作品獲得第一檢索(這是我想要什麼)的最新評論,但是當涉及到嵌套評論它的最古老的預定他們第一個(不是我所需要)。我需要訂購從最新到最舊的主要評論,任何回覆也應從最新到最舊排序。我試圖沒有成功修改我的查詢來做到這一點,但無法弄清楚。

作爲一個側面的問題,從系統角度來看,這個系統是否有意義?你是否認爲以這種方式排列嵌套評論會令人困惑?我想這樣做是因爲我的回覆按鈕位於基本評論上,一旦點擊就在基本評論下面添加一個textarea。我只是認爲,如果它看起來好像比基本評論低,而不是一直拋到嵌套答覆的底部,那麼看到你的帖子會更容易。對此有何想法?

也想解決另一個問題,我用它來頁面評論。我可以用一個簡單的限制只得到評論的x個這樣的:

mysql_query("SELECT Comments.* FROM Comments ORDER BY 
IF(Comments.orig_comment = 0, Comments.id, Comments.orig_comment)DESC,Comments.id ASC 
LIMIT 0, $page") 

這種方法顯然不注重回覆的數量,每個主要的意見。所以我最終要切斷對最後主要評論的回覆。我只想在orig_comment ='0'時強制執行限制,這樣無論評論有多少個回覆,它都會顯示所有這些回覆。我試過

mysql_query("SELECT Comments.* FROM Comments ORDER BY 
IF(Comments.orig_comment = 0, Comments.id, Comments.orig_comment)DESC,Comments.id ASC 
LIMIT 0, SELECT COUNT(id)FROM Comments WHERE orig_comment='0' LIMIT $page") 

雖然這會引發語法錯誤。

+0

它不應該是Comments.id DESC如果你想與最新的第一個排序? IF不是說按基準降序排列,而是按origin_comment降序排列。你可以使用case語句代替:http:// stackoverflow。com/questions/3550942/can-you-add-if-statement-in-php-mysql-order-by – apelsinapa 2013-03-21 02:35:07

+0

這樣做最終將最新的答覆放在最前面,沒有任何基本評論。我也試圖整合來自那篇文章的查詢,但是最後我在最前面得到了一個沒有基礎評論的回覆。 – dminicrick1 2013-03-21 02:50:04

回答

0

感謝您的評論中的答案,我試過並找到了解決方案,它不是很漂亮,但它似乎完成了工作。

SELECT *, CASE orig_comment 
    WHEN 0 THEN CONCAT_WS('.',id,LPAD((SELECT MAX(id)+1 FROM Comments WHERE orig_comment = C.id),3,'0')) 
    ELSE CONCAT_WS('.',orig_comment,LPAD(id,3,'0')) 
END AS sort 
FROM Comments as C 
ORDER BY sort DESC 

輸出將是:

id comment time  orig_comment sort 
2 Hello "2013-03-21 16:19:00" 0 2.005 
3 Hello "2013-03-21 16:19:00" 2 2.003 
4 Hello "2013-03-21 16:19:00" 2 2.004 
1 Hello "2013-03-21 16:19:00" 0 1 

排序時,這會不會是麻煩,並允許多達999次評論(由於LPAD值3) 它所做的是創建一個排序字符串,然後將其轉換爲小數點即可獲得排序權。 (但是我認爲mysql無論如何都會正確處理它。)

即使這樣做有效,我建議先計算預先排序的值,然後爲基級評論創建一個很好的值。 (也許它設置爲2.9或任何將滿足您的需求)

+0

我完全不熟悉使用LPAD。因此,試圖查看查詢的內容......它基本上將.reply_id添加到基本評論(如果它是回覆),並將.orig_id添加到基本評論(如果它是基本評論)。然後它使用十進制值將它們從base_comment.base_comment訂購到base_comment.last_reply?也許我錯過了一些東西,對嗎?如果是這樣,我將如何預先計算小數值?在我的表格中添加一列並計算每次回覆的時間?那麼我是否需要重新計算何時被刪除? – dminicrick1 2013-03-21 17:05:17

+0

@ dminicrick1 LPAD只是用n個字符填充一個字符串。你可以選擇它做什麼。如果刪除評論,我看不到排序會受到影響。 (我添加了輸出,所以你可以關注發生的事情)。評論(id 2)將有一個排序2.005,因爲它有兩個子註釋,最高的id是4.爲了讓基本評論排序在其他評論之前,你必須創建一個「更高的數字」,這可以是正如我解釋的那樣以不同的方式完成要計算:在做出回覆時,只需創建排序十進制值。雖然這個解決方案只支持1級子註釋。 – apelsinapa 2013-03-21 17:38:44

0

考慮這個例子...

DROP TABLE IF EXISTS comments; 

CREATE TABLE comments 
(comment_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,comment VARCHAR(50) NOT NULL 
,comment_date DATETIME 
,parent_id INT NULL 
); 

INSERT INTO comments VALUES 
(1  ,'Hello',       '2013-03-01 10:10:10',NULL), 
(2  ,'Bonjour',       '2013-03-02 10:10:10',NULL), 
(3  ,'How are you?',     '2013-03-03 10:10:10',1), 
(4  ,'I\'m fine thank you, and you?', '2013-03-04 10:10:10',1), 
(5  ,'Ça va?',       '2013-03-05 10:10:10',2), 
(6  ,'Je vais bien, merci, et toi?', '2013-03-06 10:10:10',2), 
(7  ,'Yes, not too bad thanks',   '2013-03-07 10:10:10',1), 
(8  ,'Oui, comme ci comme ça.',   '2013-03-08 10:10:10',2), 
(9  ,'Bon, à bientôt.',     '2013-03-09 10:10:10',2), 
(10 ,'See you soon',     '2013-03-10 10:10:10',1); 

SELECT * 
    FROM comments 
     x 
    JOIN comments y 
    ON y.parent_id = x.comment_id 
    ORDER 
    BY x.comment_date 
     , y.comment_date; 
+------------+---------+---------------------+-----------+------------+------------------------------+---------------------+-----------+ 
| comment_id | comment | comment_date  | parent_id | comment_id | comment      | comment_date  | parent_id | 
+------------+---------+---------------------+-----------+------------+------------------------------+---------------------+-----------+ 
|   1 | Hello | 2013-03-01 10:10:10 |  NULL |   3 | How are you?     | 2013-03-03 10:10:10 |   1 | 
|   1 | Hello | 2013-03-01 10:10:10 |  NULL |   4 | I'm fine thank you, and you? | 2013-03-04 10:10:10 |   1 | 
|   1 | Hello | 2013-03-01 10:10:10 |  NULL |   7 | Yes, not too bad thanks  | 2013-03-07 10:10:10 |   1 | 
|   1 | Hello | 2013-03-01 10:10:10 |  NULL |   10 | See you soon     | 2013-03-10 10:10:10 |   1 | 
|   2 | Bonjour | 2013-03-02 10:10:10 |  NULL |   5 | Ça va?      | 2013-03-05 10:10:10 |   2 | 
|   2 | Bonjour | 2013-03-02 10:10:10 |  NULL |   6 | Je vais bien, merci, et toi? | 2013-03-06 10:10:10 |   2 | 
|   2 | Bonjour | 2013-03-02 10:10:10 |  NULL |   8 | Oui, comme ci comme ça.  | 2013-03-08 10:10:10 |   2 | 
|   2 | Bonjour | 2013-03-02 10:10:10 |  NULL |   9 | Bon, à bientôt.    | 2013-03-09 10:10:10 |   2 | 
+------------+---------+---------------------+-----------+------------+------------------------------+---------------------+-----------+ 
+0

我不能按日期排序,因爲這太寬泛;在任何一天,可能會有數百條評論發佈。我寧願保持它由id排序(它看起來是一個簡單的模式到您的查詢),所以不管它什麼時候發佈它仍然會被正確排序。我將如何去分頁這些結果(我的原始文章的最後一部分)? – dminicrick1 2013-03-21 16:56:16

+0

按照我的例子,日期和時間應該是單列,但是如果id適合你,那也沒問題。 – Strawberry 2013-03-21 17:03:47

+0

好的。有關分頁問題的任何想法? – dminicrick1 2013-03-21 17:09:40