我试图为用户发表评论的网站(PHP / MySQL)制作评论部分 或回复已发布的。我知道这样做有点棘手,因为 像MySQL这样的RDBMS并不是真正用于存储分层数据的。 我找到了4个问题的解决方案(邻接列表,路径枚举,嵌套集和闭包表) 其中我选择了嵌套集(修改后的预订树遍历)。 我成功地完成了这项工作,用于提取和排序根评论及其回复 但我似乎无法找到一种方法来按点(其他列)对评论进行排序而不会破坏 父母>子链接。
想象一下这样的表:
+-------------------------------+
| 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
如果由#DES; rgt DESC" 我得到了对手,即新的第一个(从最新到最旧):
(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)
有没有办法让嵌套集模型表现得像这样。 如果可能,最好的方法是使用正确的查询,但是如果这样的查询没有 存在用PHP排序它们也是可以接受的(如果它使用合理的资源)。 如果使用嵌套集模型这是不合理的,我想知道 使用哪种模型来生成订购上述评论的所有方法。
答案 0 :(得分: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