2011-06-18 191 views
0

我有表「項」的列::MySQL查詢(連接)

|id(primary_key)|parent_id|name| 

我需要得到的是沒有孩子的所有項目。

回答

1
SELECT * FROM item WHERE id NOT IN (SELECT parent_id FROM item) 

還有其他的方式可以寫這個查詢,可能會更高性能。但是這應該讓你開始。

它將選擇在parent_id列中找不到id的所有記錄 - 表示此記錄沒有子女。

+0

請問您可以使用連接給解決方案嗎? – bob

+1

當然可以。我建議你在原文中指定這些要求。 –

+0

這會製造一個不必要的臨時表。 – 2011-06-18 23:38:53

2
SELECT [some cols] 
    FROM item i 
     LEFT JOIN item children ON children.parent_id = i.id 
WHERE children.id IS NULL; 
+0

正確答案。如果parent_id被編入索引,它將是有效的。 – 2011-06-18 23:37:15

+0

你可以提供一些圍繞你的'JOIN'條件和'WHERE'子句的教育嗎? –

+0

@Jason,當然:這是技術被稱爲自我排斥連接。您正在向結果集添加更多信息,然後從最終結果集中消除您不需要的所有內容。下面是排除連接的一個很好的解釋:http://www.xaprb.com/blog/2005/09/23/how-to-write-a-sql-exclusion-join/一旦你讀到你可以在這裏看到一個稍微複雜一些的示例:http://adam-bernier.appspot.com/post/38001/the-self-exclusion-join – bernie