【问题标题】:Query parents and children in self-referencing table查询自引用表中的父母和孩子
【发布时间】:2014-06-04 11:40:20
【问题描述】:

我在 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

用户可以添加new cmets,它们不会有parent_id,因为它们不是其他cmets的子代;用户还可以回复到通过前一种方法添加的 cmets,因此它们是主要 cmets 的子代,就像在第二级层次结构上一样。 parent_id 列表示父评论的 ID(如果存在)。如果评论没有父级,则默认 parent_id 为 -1。

话虽如此,我想查询表中的所有 cmets,每个父项后跟其子项,由 created_at ASC排序。来自上述数据集的示例:

second comment
Under second
third comment
Under third

我想过使用 GROUP BY,因为它类似于分组策略,但实际上并不是将所有子项分组到一行中。这种查询的解决方案是什么?还有更多类型的解决方案吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    它没有测试,但我认为这也应该在 MySQL 中工作:

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

    编辑: 如果您不能假设 Id 的升序与 Comments 的逻辑顺序相同,那么它会变得更复杂一些:

    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 随着 created_at 字段上升的前提,对吗?因此,如果我添加的评论 id 比任何其他评论都低,但 created_at 更高,这将不再有效。例如:在 created_at 2015-06-03T10:11:59+0000 中添加“第四条评论”,但 id 为 2,那么它将在所有其他评论之上显示此新评论。为了规避这个问题,我们是否需要为每个父级添加不同的选择查询?
    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多