订购线程/嵌套注释 - PHP

时间:2012-10-19 21:08:29

标签: php sql

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

  

示例作者说:“我使用的系统很简单,不依赖于递归。我   基本上将整个线程“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

这是一个大问题!这个人说绝对垃圾还是我做错了什么?除非数据的顺序与您想要显示的顺序完全相同,否则它将无法工作。我可以做些简单的事情来修理订单吗?

2 个答案:

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