我有一个包含分层数据的表(带有回复的注释),我想知道如何对它进行排序,以便最新评论将作为first ones和最新回复作为最后一个注释的前缀。
表的一个例子
下面是它看起来的一个例子:
id | path | reply_to | date
1 1 NULL 8:00
2 1-2 1 9:00
3 1-3 1 10:00
4 4 NULL 11:00
5 1-5 1 12:00
6 4-6 4 13:00
7 4-7 4 14:00如果我想选择结果的路径,应该按如下顺序排列:
4
4-6
4-7
1
1-2
1-3
1-5这可以使用MySQL查询吗?
直到现在我一直在做的事
到目前为止,我只选择了没有ID DESC排序的行,然后(对于每一行)我请求它的答复并通过ID ASC命令它们,我在PHP中使用PDO连接到我的数据库:
$stmt1 = $this->db->query("SELECT * FROM comments WHERE reply_to IS NULL ORDER BY id DESC");
$stmt2 = $this->db->prepare("SELECT * FROM comments WHERE reply_to = ? ORDER BY id ASC");
while($row = $stmt1->fetch()) {
//display the comment
$stmt2->execute(array($row['id']));
while($row2 = $stmt2->fetch()) {
//display all its replies
}
}但我认为,如果我只查询一次,就比像现在这样在循环中查询要好得多,对吧?
我希望我的问题可以理解。不幸的是,我不知道如何解决这个问题。我认为SQL连接是解决方案,但据我所知,它们“用于根据两个或多个表之间的公共字段组合来自两个或多个表的行”。
这里有一个可以玩的SQL Fiddle。
提前谢谢。
发布于 2014-08-25 11:13:12
这有点复杂,但您可以这样做(至少对于问题中显示的数据)。其想法是引入父信息(“回复”)。然后按以下顺序排序:
这是一个查询:
select c.*
from comments c left join
comments cparent
on c.reply_to = cparent.id
order by coalesce(cparent.date, c.date) desc,
coalesce(cparent.id, c.id),
(cparent.id is null) desc,
c.date asc;发布于 2014-08-25 11:21:50
最简单的方法:
SELECT c.* FROM
comments c
ORDER BY LEFT(c.path,1) DESC, c.path ASC发布于 2014-08-25 11:09:48
您可能可以在一个查询中执行类似的操作。
SELECT comment.path
FROM comments AS base
LEFT JOIN comments AS comment ON (
comment.id = base.id OR -- join the parents
comment.reply_to = base.id -- join the children
)
WHERE base.reply_to IS NULL
ORDER BY comment.idhttps://stackoverflow.com/questions/25484495
复制相似问题