2

我在网上找到了下面的线程评论示例,作者说这对他来说效果很好。但是,我在排序结果时遇到问题,因此线程注释位于正确的位置。这就是这个例子给我的:

示例作者说:“我使用一个简单且不依赖递归的系统。我基本上将整个线程“路径”存储为行字段。想要获得整个树结构?只需在路径上执行 ORDER BY列并使用如下的一些 PHP 代码进行格式化:"

示例数据

ID | Comment                      | Path
---+------------------------------+----------
0  | Comment #1                   | 00
1  | Comment #1 reply             | 00_01
2  | Comment #1 reply reply       | 00_01_02
3  | Comment #2                   | 00
4  | Comment #3                   | 00
5  | Comment #3 reply             | 00_04

示例 SQL

SELECT * FROM comments ORDER BY path

示例 PHP

while ($result = mysql_fetch_assoc($query)) {
    $nesting_depth = count(explode("_", $result['path']));
    $branch = str_repeat("--", $nesting_depth);
    echo $branch {$result['comment']}";
}

示例结果

Comment #1
-- Comment #1 reply
---- Comment #1 reply reply
Comment #2
Comment #3
-- Comment #3 reply

我将确切的数据添加到我的 MySQL 数据库中并对其进行了测试并按预期工作。但是,如果我更改表中数据的顺序,它就不起作用。我会解释:

新的真实测试数据

ID | Comment                      | Path
---+------------------------------+----------
0  | Comment #1                   | 00
1  | Comment #2                   | 00
2  | Comment #3                   | 00
3  | Comment #3 reply             | 00_04
4  | Comment #1 reply             | 00_01
5  | Comment #1 reply reply       | 00_01_02

看看 row[4] 和 row[5],这些回复评论是最后添加的评论,并且极大地改变了结果的顺序:

新的测试结果

Comment #1
Comment #2
Comment #3
-- Comment #1 reply
---- Comment #1 reply reply
-- Comment #3 reply

这是个大问题!这家伙是在胡说八道还是我做错了什么?除非数据与您要显示的顺序完全相同,否则它将永远无法工作。我可以做一些简单的事情来修复订单吗?

4

2 回答 2

3

每个“主”注释都必须有一个包含唯一 ID 号的路径。在您的情况下,每个“主要”评论的 ID 为00. 如果你有其中三个,那么就没有办法在两者之间得到答复。

ID | Comment                      | Path 
---+------------------------------+---------- 
0  | Comment #1                   | 00 
1  | Comment #2                   | 00 
2  | Comment #3                   | 00 
4  | Comment #1 reply             | 00_01 <-- Last item

最后一个item永远是最后一个项目(按字母顺序)。如果您用唯一的 ID 区分每个“主要”评论,那么问题就解决了。

ID | Comment                      | Path 
---+------------------------------+---------- 
0  | Comment #1                   | 01
1  | Comment #2                   | 02 
2  | Comment #3                   | 03 
4  | Comment #4 reply to 1 (1)    | 01_01 <- first key is parent_id, second is sequence
5  | Comment #5 reply to 1 (2)    | 01_02 
6  | Comment #6 reply to 4 (1)    | 04_01 
7  | Comment #7                   | 04 
8  | Comment #8 reply reply to 5  | 01_02_01 

因此,当您要回复评论时,您需要做的就是引用他们的整个路径,并在末尾添加一个索引键。

在上表中:

01_01 = parent id: 01 -> sequence: 01
04_01 = parent id: 04 (so a reply to id 4) -> sequence: 01
01_02_01 = parent_id: 01_02 (references the path of ID 5) -> sequence: 01

等等

再说一次,这是一个奇怪的结构。在我看来id/parent_id,这种事情的关系更好。

于 2012-10-19T21:43:09.767 回答
2

构建的“路径”是垃圾。我在"00_04"(评论#3 回复)中看不到任何东西可以告诉我这条评论是评论#3 的子项。我认为您希望在路径中的评论中使用实际的 ID 号。

ID | Comment                      | Path
---+------------------------------+----------
0  | Comment #1                   | 00
1  | Comment #2                   | 01
2  | Comment #3                   | 02
3  | Comment #3 reply             | 02_03
4  | Comment #1 reply             | 00_04
5  | Comment #1 reply reply       | 00_04_05
于 2012-10-19T21:19:22.767 回答