我有一个包含分层数据的表格(带有回复的评论),我想知道如何对其进行排序,以便最新评论作为第一个的前缀并且每条评论的最新回复应附加为最后一条。
以下是一个示例:
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 Joins 是解决方案,但据我所知,它们“用于组合来自两个或多个表的行,基于它们之间的公共字段”。
这是一个可以玩的SQL Fiddle。
提前致谢。
答案 0 :(得分:3)
这有点复杂,但您可以这样做(至少对于问题中显示的数据)。想法是引入父信息(“回复”)。然后按以下方式排序:
这是查询:
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;
答案 1 :(得分:2)
最简单的方法:
SELECT c.* FROM
comments c
ORDER BY LEFT(c.path,1) DESC, c.path ASC
答案 2 :(得分:0)
你可以在一个查询中做这样的事情
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.id