由另一列(除了lft和rgt之外)对嵌套集进行排序

时间:2012-02-16 16:49:55

标签: php mysql

我试图为用户发表评论的网站(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排序它们也是可以接受的(如果它使用合理的资源)。 如果使用嵌套集模型这​​是不合理的,我想知道 使用哪种模型来生成订购上述评论的所有方法。

1 个答案:

答案 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