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

3

我有一个如下的评论表,在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。

话虽如此,我想从表中查询所有评论,每个父评论后面跟随其子评论,按照创建时间升序排序。来自上述数据集的示例:

second comment
Under second
third comment
Under third

我考虑使用GROUP BY,因为它类似于分组策略,但实际上并没有将所有子项分组到单个行中。有什么解决这种查询的方法吗?还有其他类型的解决方案吗?

1个回答

3

虽未测试,但我认为这在MySQL中同样有效:

ORDER BY CASE WHEN parent_id=-1 THEN id ELSE parent_id END, created_at

编辑: 如果您不能假设ID与评论在相同的逻辑顺序上按升序排列,则会变得更加复杂:

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

确实,这正是所需的。谢谢!然而,一个问题是这个解决方案依赖于评论ID与创建时间字段一样是升序排列的,对吗?所以如果我添加了一个ID比其他任何评论都低但创建时间更晚的评论,那么这个解决方案将不再起作用。例如:添加创建时间为2015-06-03T10:11:59+0000,但ID为2的“第四条评论”,那么它将显示在所有其他评论之上。为了避免这种情况,我们需要为每个父级添加不同的选择查询吗? - Bogdan Zurac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接