[英]Mysql: Sorting newest comments to be the first and newest replies on each comment to be the last
我有一个带有层次结构数据的表(带有回复的评论),我想知道如何对其进行排序,以便将最新评论作为第一个 评论放在前面,并将每个评论的最新答复作为最后一个结尾添加 。
这是一个看起来像的例子:
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提琴演奏。
提前致谢。
这有点复杂,但是您可以做到(至少对于问题中显示的数据而言)。 这个想法是引入父信息(“答复”)。 然后按以下顺序排序:
这是查询:
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;
最简单的方法:
SELECT c.* FROM
comments c
ORDER BY LEFT(c.path,1) DESC, c.path ASC
您可能可以在一个查询中执行类似的操作
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.