我在网上找到了下面的线程评论示例,作者说它对他来说效果很好。但是,我在排序结果时遇到问题,因此线程注释位于正确的位置。这就是示例给出的内容:
示例作者说:“我使用的系统很简单,不依赖于递归。我 基本上将整个线程“path”存储为行字段。想得到 整个树结构?只需在路径列上执行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数据库并对其进行测试并按预期工作。但是,如果我更改表中数据的顺序,它就不起作用。我会解释一下:
新 REALISTIC 测试数据
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
看看行[4]和行[5],这些回复评论是最后添加的评论,并大大改变了结果的顺序:
新测试结果
Comment #1
Comment #2
Comment #3
-- Comment #1 reply
---- Comment #1 reply reply
-- Comment #3 reply
这是一个大问题!这个人说绝对垃圾还是我做错了什么?除非数据的顺序与您想要显示的顺序完全相同,否则它将无法工作。我可以做些简单的事情来修理订单吗?
答案 0 :(得分: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
关系更适合这类事情。
答案 1 :(得分: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