选择父母和孩子与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;
请注意,自联接应该是外连接,以便您不会错过没有子级的父注释。
答
我不是说完全是,我觉得你得到这样的问题,如下:
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
而我的建议使用此方法解决此问题,有以下为:
- 最简单的方法是利用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;
+1。我错过了他可能想找到没有父母的行 – a1ex07 2011-06-04 23:53:08
谢谢,a1ex07。我想你的意思是没有孩子的家长意见;-)我认为你也应该加入你的'WHERE'子句:'p.parent_id IS NULL'。干杯。 – bernie 2011-06-04 23:56:22
如果我对孩子有孩子会怎么样?我不需要有多个连接? – Dejell 2013-12-03 13:55:29