选择Parent和Children With MySQL

时间:2011-06-04 23:34:33

标签: mysql sql

我知道这个问题经常出现,但今天我找不到我正在寻找的答案。我有一个有这个模式的表。

CREATE TABLE `comments` (
    `id` bigint(10) unsigned not null auto_increment,
    `parent_id` bigint(10) unsigned default 0,
    `date_sent` datetime not null,
    `content` text not null,
    PRIMARY KEY(`id`)
) ENGINE=InnoDB;

我想选择父行以及这些行的子项。我不允许孩子生孩子,所以这只是一个父母,有许多孩子。

我认为我之前已经看到过这种情况,或者是内部联合。

3 个答案:

答案 0 :(得分:23)

父母是没有parent_id的记录 儿童的parent_id等于父评论的id

  SELECT ...
    FROM comments AS parent
         LEFT JOIN comments AS child 
         ON child.parent_id = parent.id
   WHERE parent.parent_id IS NULL
ORDER BY parent.id, child.id;

请注意,自联接应该是外部联接,这样您就不会错过没有子项的父注释。

答案 1 :(得分:3)

您在寻找

吗?
SELECT p.id, child.*
FROM comments p
INNER JOIN comments child ON (child.parent_id = p.id)
WHERE ....

<强>更新
 如果您想查看没有父母的行

,请LEFT JOIN

答案 2 :(得分:2)

我没有完全说出来,我认为你得到的这类问题如下:

Ordered_Item

ID | Item_Name
1  | Pizza
2  | Stromboli

Ordered_Options

Ordered_Item_ID | Option_Number | Value
        1               43         Pepperoni
        1               44         Extra Cheese
        2               44         Extra Cheese

输出

ID | Item_Name | Option_1 | Option_2
1    Pizza       Pepperoni  Extra Cheese
2    Stromboli     NULL     Extra Cheese

我使用此方法的建议解决了这个问题,如下所示:

  1. 最简单的方法是使用GROUP_CONCAT组 在这里运作..
  2. select 
            ordered_item.id as `Id`, 
            ordered_item.Item_Name as `ItemName`,
    
      GROUP_CONCAT(Ordered_Options.Value) as `Options`
    
      from ordered_item, ordered_options
    
      where ordered_item.id=ordered_options.ordered_item_id
    
      group by ordered_item.id
    

    哪个会输出:

    Id              ItemName       Options
    1               Pizza          Pepperoni,Extra Cheese
    2               Stromboli      Extra Cheese
    

    这样您就可以拥有任意数量的选项而无需修改查询。

    啊,如果您看到结果被裁剪,您可以像这样增加GROUP_CONCAT的大小限制:

    SET SESSION group_concat_max_len = 8192;