MySQL层次结构关系在同一个表中:如何排除父母?

时间:2015-01-14 17:25:18

标签: mysql performance

我有一张这样的表:

DESC mytable

id  | parent
1   | 2
2   | null
3   | null
4   | null
5   | 3
... | ...

3种条目:

  • 不是父母且没有父母的条目(例如:4)
  • 不是父母并且有父母的条目(例如:1,5)
  • 作为父母[并且没有父母]的条目(例如:2,3)

我正试图让每一行都不是父母。

起初我试过这个:

SELECT * FROM mytable WHERE id NOT IN (SELECT DISTINCT parent FROM mytable);

太慢了,所以我尝试了这个:

SELECT m.* FROM mytable m
# tmp.* will contain the first child
LEFT JOIN mytable tmp ON tmp.parent = m.id
# only rows with no children
WHERE tmp.id IS NULL

但它仍然太慢......

在我的第二个查询中,我知道MySQL会抓取每个孩子,但只将第一个存储在tmp。*中,但我找不到高效方式将搜索限制为1个孩子。 (我看了here和其他网站)

你对我如何改善执行时间有什么想法吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

加入当然会有效,但你也可以使用存在...我不确定哪一个会在解释中运行得更好。如果您索引父列也可能会有所帮助。

试试这个:

SELECT m.* FROM mytable m WHERE NOT EXISTS (SELECT 1 FROM mytable WHERE parent = m.ID)