在自引用表中查询父项和子项

时间:2014-06-04 11:40:20

标签: mysql sql

我在 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,因为它类似于分组策略,但实际上并没有将所有子组合成一行。什么是这种查询的解决方案?是否有更多类型的解决方案?

1 个答案:

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