询问原因“ERROR 1235(42000):此版本的MySQL尚不支持'LIMIT&IN/ALL/ANY/SOME子查询'”?
问题描述:
我知道这个限制和替代重写SQL。但我不知道为什么?任何人都可以提供这个限制的推论吗?询问原因“ERROR 1235(42000):此版本的MySQL尚不支持'LIMIT&IN/ALL/ANY/SOME子查询'”?
答
像
select * from table where id in (select id from othertable)
的查询基本上都会被解释为
select * from table where exists
(select id from othertable where table.id = othertable.id)
这就是你所期望的该查询。您特别期待IN
查询使用othertable.id
上的索引。在manual,它被描述为
一些优化,MySQL的本身就是有:[...]
- 在MySQL改写,ALL,ANY,有的在试图查询,以便利用子查询中的选择列列被索引的可能性。
这些,而不是纯粹的巧合,恰恰如果添加limit
错误消息中提到的四个运营商:
select * from table where id in
(select id from othertable order by id limit 10)
ERROR 1235(42000):该版本的MySQL还不支持'LIMIT & IN/ALL/ANY/SOME子查询'。
重写该查询以类似的方式是不能直接了,因为它是东西比
select * from table where exists
(select id from othertable where table.id = othertable.id
order by id limit 10)
若要限制执行IN
中,MySQL可以检索的othertable
10个第一行不同,将结果集存储为派生的子表并检查该ID是否在那里。你当然可以做到这些:
select * from table where id in
(select id from
(select id from othertable order by id limit 10) subtable)
这种意志,类似于第一个例子,被解释为
select * from table where exists
(select * from
(select id from othertable order by id limit 10) subtable
where table.id = subtable.id)
因此,它是如何优化工程的混合物(这将改写查询),limit
如何工作(它会在找到行之后停止执行,不会跳过它们),期望什么(使用索引)并最终如果开发人员决定允许特定的语法。
如果MySQL遇到IN
和limit
子查询,你可能会争辩说MySQL总是会回退执行查询作为派生表 - 但你也可以明确地使用派生子表。你也可以争辩说,你可以想出实现这个方法的方法或者实现它的方式 - 你是对的,有。这就是为什么错误信息中有“还有”的原因。所以请随意实施它们或者至少描述它们,例如尽可能彻底地在功能请求中,并考虑MySQL所有其他部分如何工作。但要确保它们实际上比使用子表更快。