2011-06-04 160 views
8

我知道這個問題經常出現,但今天我找不到我要找的答案。我有一個這個模式的表。選擇父母和孩子與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; 

我想選擇父行和這些行的子代。我不允許孩子生孩子,所以它只是一個家長,有許多孩子。

我想我以前見過這樣的工作,或者內部連接。

回答

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; 

請注意,自聯接應該是外連接,以便您不會錯過沒有子級的父註釋。

+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

3

您是否在尋找

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

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組 功能在這裏..
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;