当你在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