选择父母和孩子与MySQL

问题描述:

我知道这个问题经常出现,但今天我找不到我要找的答案。我有一个这个模式的表。选择父母和孩子与MySQL

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; 

我想选择父行和这些行的子代。我不允许孩子生孩子,所以它只是一个家长,有许多孩子。

我想我以前见过这样的工作,或者内部连接。

父母没有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; 

请注意,自联接应该是外连接,以便您不会错过没有子级的父注释。

+0

+1。我错过了他可能想找到没有父母的行 – a1ex07 2011-06-04 23:53:08

+0

谢谢,a1ex07。我想你的意思是没有孩子的家长意见;-)我认为你也应该加入你的'WHERE'子句:'p.parent_id IS NULL'。干杯。 – bernie 2011-06-04 23:56:22

+2

如果我对孩子有孩子会怎么样?我不需要有多个连接? – Dejell 2013-12-03 13:55:29

您是否在寻找

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

UPDATE
或者LEFT JOIN如果你想看到没有父母

+2

如果我有孩子的童车来?我不需要有多个连接? – Dejell 2013-12-03 13:55:04

+0

你如何解决许多儿童问题? – 2015-12-04 15:41:39

+0

我想限制父级的查找。我怎么能限制它。 – Adrian 2017-10-05 09:22:02

我不是说完全是,我觉得你得到这样的问题,如下:

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组 功能在这里..
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;