我知道这个问题经常出现,但今天我找不到我正在寻找的答案。我有一个有这个模式的表。
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;
我想选择父行以及这些行的子项。我不允许孩子生孩子,所以这只是一个父母,有许多孩子。
我认为我之前已经看到过这种情况,或者是内部联合。
答案 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
我使用此方法的建议解决了这个问题,如下所示:
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;