解决mysql不可用limit子查询

文章目录

  1. 1. 方法一:构造临时表
  2. 2. 方法二:连表查询

当你在mysql子查询中使用了limit,那么恭喜你,你会看到

ERROR 1235 (42000): This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery’

limit在mysql中本来的效率就不高,mysql于是也禁止在子查询中使用limit,可是如果非要用呢

比方说需求是:

  • 一等奖5名
  • 二等奖15名
  • 获了一等奖的不能再获二等奖

直觉告诉我们,下边的sql是可以的。

select 获二等奖用户ID from t where 获二等奖的条件 and 用户ID 
not in 
(select 获一等奖用户ID from t where 获一等奖的条件 limit 5) 
limit 15;

可是,上边的limit子查询是不被允许的啊,怎么办,目前我知道的有两种:

方法一:构造临时表

select 获二等奖用户ID from t where 获二等奖的条件 and 用户ID 
not in 
(select * from 
    (select 获一等奖用户ID from t where 获一等奖的条件 limit 5) 
as t )
limit 15;

方法二:连表查询

select * from 
(select 获二等奖用户ID from t where 获二等奖的条件) 
as t1,
    (select 获一等奖用户ID from t where 获一等奖的条件 limit 5) 
    as t2
where t1.用户ID<> t2.用户ID
limit 15;

经过explain查看两者的效率,没有差别,都用了filesort全表扫描。但是第一种更易书写。

如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com 本文链接 : https://newbmiao.github.io/2015/08/01/use-limit-subquery-in-mysql.html