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

张子凡 设计开发 2017-06-29 14:25:18 阅读(7010) 评论(2)

最近这一段时间其实子凡都在开发泪雪用户中心,目前进度已经过半,这一次的开发将很多的功能都做了深度的优化和升级完善,同时也会将我们的服务器从虚拟主机迁移到服务器,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. 乐聚
    1楼
    乐聚 3个月前 (07-17)

    原来是这样啊

  2. 太仓
    2楼
    太仓 3个月前 (07-11)

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