【发布时间】:2018-09-19 09:39:24
【问题描述】:
我有一个 cmets 系统,它使用 adjacency list 来存储分层数据(我相信),例如:MySql 表有列 id、parent_id、date、...,其中有注释没有parent_id 是主要评论,而带有parent_id 的评论自然是回复。
在初始页面加载时,我进行了一个 Ajax 调用,该调用加载了所有没有 parent_id 的 cmets,因此所有主要 cmets。
SELECT * FROM comms WHERE parent_id IS NULL
现在,如果任何 cmets 已回复,则会为该评论显示一个类似“加载回复”的按钮,然后单击另一个调用,加载所有具有 parent_id 评论 id 的 cmets,然后递归查询加载回复的回复等。这很好用,但问题是从它们的加载顺序来看,你无法真正分辨出什么是重播。
所以我想要对它们进行排序,以便在它所属的评论下进行重播。
现在这是否可能仅来自 sql 执行类似ORDER BY id = parent_id 的操作,对它们进行排序以便它们有点意义,或者我应该从 php 处理这个?还是我应该重新开始并以不同的方式存储它们?
编辑:第二个查询的一部分(示例取自 this 我不久前找到的答案)
SELECT date_p, parent_id, id
FROM (SELECT * FROM comms) rec,
(SELECT @pv := 14) initialisation
WHERE find_in_set(parent_id, @pv) > 0
AND @pv := concat(@pv, ',', id) ORDER BY ?
如果我使用我喜欢的答案中提供的“备选方案 1”,订购方法会有所不同还是更好?
这就是我想要达到的目标:
<p>Main comm 1</p>
<p>reply to main comm 1</p>
<p>another reply to main comm 1</p>
<p> replay to reply of main comm 1</p>
<p> yet another reply to main comm 1</p>
<p>Main comm 2</p>
<p>Main comm 3</p>
【问题讨论】:
-
您希望它们以什么顺序出现在页面上?时间顺序?您是否正在捕获每条评论的时间戳?如果是这样,您通常会按该列排序。
-
@IanDrake 是的,我正在捕获时间戳,我希望它们按它们所属的 cmets 排序,所以如果有人用 4 的
id回复评论,我想回复在该评论下方。 -
查看您的第二个查询可能会有所帮助,该查询在用户单击“加载回复”时运行。您可以更新您的问题以添加它吗?
-
@IanDrake 这是一个包含两个连接的大查询,所以我将其缩减为我认为重要的部分。
-
您为什么不通过
@pv订购它们?订购似乎是件好事,因为它包含路径。您可以用零对@pv 进行 LPAD,以便顺序正确
标签: php mysql sql ajax recursive-query