我在 MySQL 中有评论表格,如下所示::
content created_at id parent_id
"second comment", 2014-06-03T10:08:44+0000, 37, -1
"third comment", 2014-06-03T10:10:35+0000, 40, -1
"Under third", 2014-06-03T10:10:44+0000, 41, 40
"Under second", 2014-06-03T10:11:59+0000, 42, 37
用户可以添加新条评论,这些评论不会包含parent_id,因为它们不是其他评论的子级;用户还可以回复到通过上一个方法添加的评论,因此他们是主要评论的子级,就像在第二级层次结构中一样。 parent_id 列表示父评论的ID(如果存在)。如果评论没有父母,则默认 parent_id 为-1。
话虽如此,我想查询表格中的所有评论,每个父母后跟其子项,命令 by created_at ASC。上述数据集中的示例:
second comment
Under second
third comment
Under third
我想过使用GROUP BY,因为它类似于分组策略,但实际上并没有将所有子组合成一行。什么是这种查询的解决方案?是否有更多类型的解决方案?
答案 0 :(得分:2)
它没有测试,但我认为这也适用于MySQL:
ORDER BY CASE WHEN parent_id=-1 THEN id ELSE parent_id END, created_at
修改强> 如果你不能假设Ids以与评论相同的逻辑顺序升序,那么它会变得更复杂:
SELECT parent_id,id,created_at parent_date,null child_date,content
FROM Comments
WHERE parent_id=-1
UNION
SELECT c.parent_id,c.id,p.created_at as parent_date,c.created_at as child_date,c.content
FROM Comments c
JOIN (SELECT id,created_at,content
FROM Comments
WHERE parent_id=-1
GROUP BY id,created_at,content) p ON p.id=c.parent_id
ORDER BY parent_date,child_date