Mysql:将最新评论排序为每个评论的最新和最新回复

时间:2014-08-25 11:04:35

标签: php mysql

我有一个包含分层数据的表格(带有回复的评论),我想知道如何对其进行排序,以便最新评论作为第一个的前缀并且每条评论的最新回复应附加为最后一条

表格的一个例子

以下是一个示例:

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

提前致谢。

3 个答案:

答案 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