2011-05-03 36 views
3

我已經在這裏和其他地方閱讀超過10個相關的職位,仍然想不通這一個,是相當新的PHP和MySQL:MySQL查詢排序的意見和它們的嵌套回覆

我使用WordPress和努力在舊主題中實現嵌套註釋。我的表是所有組(姑且稱之爲「意見」),並具有以下字段:

comment_ID | comment_date | comment_parent, etc. 

comment_parent仍然等於頂級評論0;它等於在嵌套回覆中回覆的評論的comment_ID

原來的MySQL查詢看起來是這樣的:

SELECT * FROM $wpdb->comments 
WHERE comment_post_ID = %d AND comment_approved = '1' 
ORDER BY comment_date ASC LIMIT %d" 

通過遵循並輸出評論列表,評論是按日期不尊重嵌套回覆這樣列出的PHP:顯然

comment_ID | comment_date | comment_parent 
100   Jan 01   0  (this is a top level comment) 
104   Jan 03   0  (this is a top level comment) 
106   Jan 04   100 (this is a reply to the first comment) 
108   Jan 05   104 (this is a reply to the second comment) 

,由於我按日期排序,因此序列被破壞。註釋106應立即出現下面的評論100,和評論108應該是下面的評論104

我想不會改變我的PHP,我想用MySQL查詢要做到這一點,但不能得到它的權利。我曾嘗試使用JOIN,GROUP BY,HAVING等類似問題中的建議,但沒有取得任何成功。有沒有辦法讓我從查詢中獲得正確的排序權,並保持我的php完好無損?

+0

問候!歡迎來到SO!即使你確實創建了這樣的查詢,你會不會獲得重複的內容? 「嵌套註釋」列中的所有列將包含相同的數據。然後你必須編寫代碼來'忽略'以前的列'。您可能想嘗試查看Fowler的'依賴映射'模式 - 它不會在MySQL中使用,並且可能需要在代碼中處理。 – PhD 2011-05-03 19:01:26

+0

您可以先一次獲取所有頂級註釋,然後在第二輪中嵌套註釋(全部),然後相應地填充您的內容。或者根據上述內容寫出一些不重要的代碼以使其正確。 AFAIK可能無法查詢沒有重複的內容。我也想知道這個解決方案,這就是我迄今爲止處理它的方式! – PhD 2011-05-03 19:04:35

+1

試試這個:http://stackoverflow.com/questions/5280569/how-to-implement-a-nested-comment-system – PhD 2011-05-03 19:05:56

回答

3

好了,我終於想通了,由於部分上面Nupul的評論誰說:「你可以先取一氣呵成在第二輪的所有頂級意見,然後嵌套評論(全部)和相應地填充你的內容。「我確實試過該選項失敗,但是這激勵着我堅持下去......

爲了記錄在案,並希望這能幫助別人的未來,這裏是我是如何固定它。 兩個獨立的MySQL查詢獲取第一頂級評論第二,嵌套評論回覆(這些查詢的格式爲WordPress。)

$comments = $wpdb->get_results($wpdb->prepare(" 
    SELECT * 
    FROM $wpdb->comments 
    WHERE comment_post_ID = %d AND comment_approved = '1' AND comment_parent = '0' 
    ORDER BY comment_date ASC 
    LIMIT %d 
",etc,etc)); 

$replies = $wpdb->get_results($wpdb->prepare(" 
    SELECT * 
    FROM $wpdb->comments 
    WHERE comment_post_ID = %d AND comment_approved = '1' AND comment_parent <> '0' 
    ORDER BY comment_date ASC 
    LIMIT %d 
",etc,etc)); 

然後我進入我的主要意見環路(FOREACH)尋找頂級評論只。在這一循環中,在底部,我跳進一個嵌套的IF循環尋找嵌套評論,其中

$ reply-> comment_parent == $ comment-> COMMENT_ID(我比較2個MySQL查詢)

和如果真調整$評論等於$回覆讓自己的嵌套評論由WordPress的正確迴應。然後我將$ comments的值返回到它的原始值並退出我的嵌套註釋循環返回到主FOREACH。

我的推理或執行中可能存在缺陷,但它的作用就像一個魅力!當然,這並不提供額外的嵌套級別,並且所有嵌套的註釋都是一個接一個地寫入,即使它們是對方的回覆,但這對我來說已經足夠了!

對於演示,http://www.vincentmounier.com/blog2/並單擊帖子底部的任何「顯示評論」鏈接。努普爾,再次感謝你的動力!

+0

很高興知道它的工作。現在它確實......查找相關的映射,並將它與您的解決方案進行比較,它會匹配像一個魅力:) – PhD 2011-05-04 05:38:31

+0

根據我的假設a新概念的執行頭痛水平會隨着難以找到關於它的信息而成比例地上升,依賴映射可能是要走的路,但男孩會受到傷害!我只是環顧網絡一會兒而放棄了;對我來說太混亂或太先進。但感謝您的建議! :) – Vincent 2011-05-04 13:39:31

+0

我知道這是舊的,但我想任何人查看此知道,只是運行兩個單獨的查詢不是一個很好的答案。至少你可以做一個'UNION'而不是兩個單獨的查詢。性能和效率非常重要,運行多個查詢對於大多數問題來說是一個非常糟糕的解決方案。在這個例子中,你甚至不需要做兩個查詢。這是絕對的浪費。 – 2016-04-12 21:17:59

3

你可能會更好改變你的表的設計。實現嵌套註釋的更好方法之一是使用修改先序樹遍歷(MPTT)

This is an article about an MPTT menu但您應該能夠學習如何使用類似的方案實現評論系統。

+0

是的,我已經讀過這個地方,但決定反對它,不想要重寫我的WordPress數據庫 - 舊的主題是不值得的,我會改變主題之前搞亂數據庫... – Vincent 2011-05-03 19:11:01

+0

更具體地說,WordPress已經支持嵌套評論,但我添加了內嵌評論顯示的主題,並有繞過常規評論顯示系統,並執行我的MySQL查詢... – Vincent 2011-05-03 19:14:42