询问原因“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遇到INlimit子查询,你可能会争辩说MySQL总是会回退执行查询作为派生表 - 但你也可以明确地使用派生子表。你也可以争辩说,你可以想出实现这个方法的方法或者实现它的方式 - 你是对的,有。这就是为什么错误信息中有“还有”的原因。所以请随意实施它们或者至少描述它们,例如尽可能彻底地在功能请求中,并考虑MySQL所有其他部分如何工作。但要确保它们实际上比使用子表更快。