我有一张这样的表:
DESC mytable
id | parent
1 | 2
2 | null
3 | null
4 | null
5 | 3
... | ...
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和其他网站)
你对我如何改善执行时间有什么想法吗?
感谢您的帮助
答案 0 :(得分:1)
加入当然会有效,但你也可以使用存在...我不确定哪一个会在解释中运行得更好。如果您索引父列也可能会有所帮助。
试试这个:
SELECT m.* FROM mytable m WHERE NOT EXISTS (SELECT 1 FROM mytable WHERE parent = m.ID)