首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql:将最新评论排序为第一条评论,每条评论的最新回复排序为最后一条

Mysql:将最新评论排序为第一条评论,每条评论的最新回复排序为最后一条
EN

Stack Overflow用户
提问于 2014-08-25 11:04:35
回答 3查看 561关注 0票数 2

我有一个包含分层数据的表(带有回复的注释),我想知道如何对它进行排序,以便最新评论将作为first ones最新回复作为最后一个注释的前缀。

表的一个例子

下面是它看起来的一个例子:

代码语言:javascript
复制
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

如果我想选择结果的路径,应该按如下顺序排列:

代码语言:javascript
复制
4
4-6
4-7
1
1-2
1-3
1-5

这可以使用MySQL查询吗?

直到现在我一直在做的事

到目前为止,我只选择了没有ID DESC排序的行,然后(对于每一行)我请求它的答复并通过ID ASC命令它们,我在PHP中使用PDO连接到我的数据库:

代码语言:javascript
复制
$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

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-25 11:13:12

这有点复杂,但您可以这样做(至少对于问题中显示的数据)。其想法是引入父信息(“回复”)。然后按以下顺序排序:

  • 父母亲的日期和父的id -所以所有父消息都在一起
  • 然后把父母放在第一位
  • 那就按时间点剩下的

这是一个查询:

代码语言:javascript
复制
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;
票数 3
EN

Stack Overflow用户

发布于 2014-08-25 11:21:50

最简单的方法:

代码语言:javascript
复制
  SELECT c.* FROM 
    comments c
  ORDER BY LEFT(c.path,1) DESC, c.path ASC
票数 2
EN

Stack Overflow用户

发布于 2014-08-25 11:09:48

您可能可以在一个查询中执行类似的操作。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25484495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档