2011-06-18 160 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