MySQL嵌套查询“LIMIT & IN/ALL/ANY/SOME”错误解决方法

leixue 设计开发 2017-06-29 14:25:18 阅读(...) 评论(5)

最近这一段时间其实子凡都在开发泪雪用户中心,目前进度已经过半,这一次的开发将很多的功能都做了深度的优化和升级完善,同时也会将我们的服务器从虚拟主机迁移到服务器,SSL/HTTPS 也将是必备之一,那么也在这开发中遇到了一些问题,不过也都很好的解决了,那么最近也是在开发用户系统的登录记录功能,所以子凡就简单的把这个问题分享一下解决方法吧!

MySQL

我们都知道,现在很多完善的用户系统都会提供登录记录功能,而且在之前的公安备案交互式网站的时候就发现,这些功能也都是里面的一些要求,而我们的泪雪用户中心这次升级也注定要完善这个功能,那么用户的登录记录就必须做好控制,否则数据库就会无限制的增加,用户的登录记录也就变得无限制的增加,从而造成数据库的冗余和不必要的浪费,所以子凡选择用MySQL的嵌套语句和 not in 来保留最新的 100 条或者 1000 条登录记录。

其中子凡就遇到了一个问题:

1
delete table where uid='6'and id NOT IN ( select id from table where uid='6' order by id desc LIMIT 3)

执行该条语句的时候会出现:This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 的错误提示。也就是说 MySQL 不支持 limit,所以就想到绕开一下,把这个嵌套再来一层,这样似乎就完美解决了,例如:

1
delete from table where uid='6'and id NOT IN (select x.id from ( select id from table where uid='6' order by id desc LIMIT 3) as x)

看上去虽然变得好像负责了一点点,但是重点解决的问题,还算不错吧,同时子凡也在网上看到有人有更简单的方法,就是把限制条件放到 from 而非 where 子句中,就不必出现嵌套再嵌套。

1
select * from (select id from table limit 12) as foo;

但似乎这个方法并不太适用于子凡这个场景,所以这里分享出来给大家一个学习参考,可以用在其它的地方或者场景还是极其不错的。

除非注明,否则均为泪雪博客原创文章,禁止任何形式转载

本文链接:https://zhangzifan.com/mysql-select-limit.html

发表评论

登录 后参与评论
  1. selenium
    1楼
    selenium 5个月前 (03-28)

    你可真机智,我是把那个子查询弄成视图问题也能解决

  2. wu
    2楼
    wu 8个月前 (12-24)

    还好看了,,不然就去更版本了

  3. 乐聚
    3楼
    乐聚 2年前 (2017-07-17)

    原来是这样啊

  4. 太仓
    4楼
    太仓 2年前 (2017-07-11)

    学习了,最近在学习这方面呢