2012-02-16 41 views
3

我試圖做一個網站(PHP/MySQL的),用戶可以發表評論 或回覆已經發布者的註釋部分。我知道這樣做有點棘手,因爲 像MySQL這樣的RDBMS並不是真正用於存儲分層數據的。 我發現4個解決我的問題(鄰接表,路徑枚舉,嵌套集合和關閉表) 的我選擇了嵌套集合(改性預購樹的遍歷)。 我已經成功地使這項工作對拉動和排序根的意見和答覆 ,但我似乎無法找到一種方法來通過點(其它列)打破內部消除了 父>子鏈接的評論進行排序。訂購嵌套組的另一列(比LFT和RGT等)

想象一下,一個表是這樣的:

+-------------------------------+ 
| id | comment | lft | rgt | pts| 
+-------------------------------+ 
+-------------------------------+ 
| 1 | abc  | 1 | 8 | 3 | 
+-------------------------------+ 
| 2 | 123  | 2 | 7 | 1 | 
+-------------------------------+ 
| 3 | xyz  | 3 | 4 | 5 | 
+-------------------------------+ 
| 4 | www  | 5 | 6 | 4 | 
+-------------------------------+ 
| 5 | com  | 9 | 10 | 9 | 
+-------------------------------+ 

如果我爲了這個由 「LFT ASC」 我得到標準的時間順序(從舊到新):

(1) abc 
--(2) 123 
----(3) xyz 
----(4) www 
(5) com 

如果orered「 rgt DESC「 我得到oposite即新的第一(最新到最舊):

(5) com 
(1) abc 
--(2) 123 
----(4) www 
----(3) wxy 

所有這一切都像一個魅力。 問題是我似乎無法找到一種方法來按點排列評論。 最後,我想獲得的訂單是這樣的:

(5) com (9 pts) 
(1) abc (3 pts) 
--(2) 123 (1 pts) 
----(3) xyz (5 pts) 
----(4) www (4 pts) 

有什麼辦法使嵌套集合模型這樣的表現。 如果possile,要做到這一點,最好的辦法是通過使用正確的查詢,但如果這樣的查詢不存在 用PHP命令他們也是可以接受的(如果它使用資源的合理ammout)。 如果這使用嵌套集合模型是不是合理,可能我想知道 使用哪種模式來產生所有訂購上述mentined的意見的方式。

+1

爲什麼不只是存儲註釋的父ID的答覆是,然後使用PHP構建嵌套? – MetalFrog 2012-02-16 16:52:20

+0

是什麼定義了家長評論與孩子評論? LFT和RGT指定什麼?您似乎錯過了最常用的存儲此類數據的方法......在子數據中指定父標識符,並將0用於沒有父項的數據。 – Fosco 2012-02-16 16:53:08

+0

@Fosco我認爲你指的是從數據庫中提取數據時有缺點的鄰接表模型(它需要很多SELECT語句來拉一頁評論)。看到這個鏈接: http://www.sitepoint.com/hierarchical-data-database/ – Alternatex 2012-02-16 16:59:45

回答

1

我相信這可以歸結爲越來越深,然後通過深度排序,然後點。

SELECT 
    c.*, 
    (COUNT(p.id) - 1) AS depth 
FROM 
    comments AS c 
    LEFT JOIN comments AS p ON c.lft BETWEEN p.lft AND p.rgt 
GROUP BY c.id 
ORDER BY depth, c.pts DESC 

會產生:

id comment lft  rgt  pts  depth 
5 com  9  10  9  0 
1 abc  1  8  3  0 
2 123  2  7  1  1 
3 xyz  3  4  5  2 
4 www  5  6  4  2