zoukankan      html  css  js  c++  java
  • 绕过mysql的id:32933 BUG 实现order by limit 正常取数据.

    今天在写分页的时候遇到了一个Mysql的一个BUG,Google了一下发现网上提出这个问题的Blog就俩还都没有给出解决方案,其实mysql官方早在2007年就已经发布了声明。BUG ID:32933;

    发现有人给出了解决方案。后经证实此法用途比较少无法满足一些查询需求。

    经过本人一番研究已找到解决方案!

    如下所示:

    mysql> select * from l_school;
    +----+--------------------+------+-------+
    | id | name               | area | order |
    +----+--------------------+------+-------+
    |  1 | 中国人民大学       | 北京 |     1 |
    |  2 | 北京交通大学       | 北京 |     1 |
    |  3 | 北京科技大学       | 北京 |     2 |
    |  4 | 北京邮电大学       | 北京 |     1 |
    |  5 | 北京林业大学       | 北京 |     1 |
    |  6 | 北京理工大学       | 北京 |     2 |
    |  7 | 北京航空航天大学   | 北京 |     1 |
    |  8 | 首都师范大学       | 北京 |     1 |
    |  9 | 中国矿业大学       | 北京 |    12 |
    | 10 | 清华大学           | 北京 |     2 |
    | 11 | 北京大学           | 北京 |     1 |
    | 12 | 中国地质大学       | 北京 |     2 |
    | 13 | 中国农业大学       | 北京 |     2 |
    | 14 | 我想去你们公司配镜 | 北京 |     1 |
    | 15 | 北京外国语大学     | 北京 |     1 |
    | 16 | 北京语言大学       | 北京 |     2 |
    | 17 | 北京信息科技大学   | 北京 |     2 |
    | 18 | 找不到我的学校     | 未知 |     2 |
    +----+--------------------+------+-------+
    18 rows in set

    现有如上数据需要做一个分页每页显示13条数据要按order列降序排列;

    我想肯定有童鞋会这么写

    mysql> select * from l_school order by `order` desc limit 0,13;
    +----+------------------+------+-------+
    | id | name             | area | order |
    +----+------------------+------+-------+
    |  9 | 中国矿业大学     | 北京 |    12 |
    | 16 | 北京语言大学     | 北京 |     2 |
    | 12 | 中国地质大学     | 北京 |     2 |
    |  6 | 北京理工大学     | 北京 |     2 |
    | 13 | 中国农业大学     | 北京 |     2 |
    | 18 | 找不到我的学校   | 未知 |     2 |
    |  3 | 北京科技大学     | 北京 |     2 |
    | 17 | 北京信息科技大学 | 北京 |     2 |
    | 10 | 清华大学         | 北京 |     2 |
    | 11 | 北京大学         | 北京 |     1 |
    |  8 | 首都师范大学     | 北京 |     1 |
    |  7 | 北京航空航天大学 | 北京 |     1 |
    |  5 | 北京林业大学     | 北京 |     1 |
    +----+------------------+------+-------+
    13 rows in set

    恩不错完美!......先不要高兴的太早问题马上就出来了!接下来咱们来取剩下的数据!

    mysql> select * from l_school order by `order` desc limit 13,13;
    +----+------------------+------+-------+
    | id | name             | area | order |
    +----+------------------+------+-------+
    |  4 | 北京邮电大学     | 北京 |     1 |
    |  5 | 北京林业大学     | 北京 |     1 |
    | 11 | 北京大学         | 北京 |     1 |
    |  7 | 北京航空航天大学 | 北京 |     1 |
    |  1 | 中国人民大学     | 北京 |     1 |
    +----+------------------+------+-------+
    5 rows in set

    上面取出13条加上这次的5条正好18条!有的同学可能发下自己这么容易就搞定了而沾沾自喜!其实......好戏来了!

    眼尖的同学可能已经发现了上门的数据有问题!来来咱们来对比一下两次的数据吧!

    第一次的数据-------
    +----+------------------+------+-------+
    | id | name             | area | order |
    +----+------------------+------+-------+
    |  9 | 中国矿业大学     | 北京 |    12 |
    | 16 | 北京语言大学     | 北京 |     2 |
    | 12 | 中国地质大学     | 北京 |     2 |
    |  6 | 北京理工大学     | 北京 |     2 |
    | 13 | 中国农业大学     | 北京 |     2 |
    | 18 | 找不到我的学校   | 未知 |     2 |
    |  3 | 北京科技大学     | 北京 |     2 |
    | 17 | 北京信息科技大学 | 北京 |     2 |
    | 10 | 清华大学         | 北京 |     2 |
    | 11 | 北京大学         | 北京 |     1 |
    |  8 | 首都师范大学     | 北京 |     1 |
    |  7 | 北京航空航天大学 | 北京 |     1 |
    |  5 | 北京林业大学     | 北京 |     1 |
    +----+------------------+------+-------+
    13 rows in set
    第二次的数据-------
    +----+------------------+------+-------+
    | id | name             | area | order |
    +----+------------------+------+-------+
    |  4 | 北京邮电大学     | 北京 |     1 |
    |  5 | 北京林业大学     | 北京 |     1 |
    | 11 | 北京大学         | 北京 |     1 |
    |  7 | 北京航空航天大学 | 北京 |     1 |
    |  1 | 中国人民大学     | 北京 |     1 |
    +----+----------
    眼尖的童鞋可能已经发下问题所在了!
    what fuck!
    这是什么东东!
    咱们附上总表来对比下
    
    咱们先不写limit 咱们直接写排序
    mysql> select * from l_school order by `order` desc 
    ;
    +----+--------------------+------+-------+
    | id | name               | area | order |
    +----+--------------------+------+-------+
    |  9 | 中国矿业大学       | 北京 |    12 |
    | 18 | 找不到我的学校     | 未知 |     2 |
    | 17 | 北京信息科技大学   | 北京 |     2 |
    | 16 | 北京语言大学       | 北京 |     2 |
    | 13 | 中国农业大学       | 北京 |     2 |
    | 12 | 中国地质大学       | 北京 |     2 |
    | 10 | 清华大学           | 北京 |     2 |
    |  6 | 北京理工大学       | 北京 |     2 |
    |  3 | 北京科技大学       | 北京 |     2 |
    |  8 | 首都师范大学       | 北京 |     1 |
    |  2 | 北京交通大学       | 北京 |     1 |
    | 15 | 北京外国语大学     | 北京 |     1 |
    | 14 | 我想去你们公司配镜 | 北京 |     1 |
    |  4 | 北京邮电大学       | 北京 |     1 |
    |  5 | 北京林业大学       | 北京 |     1 |
    | 11 | 北京大学           | 北京 |     1 |
    |  7 | 北京航空航天大学   | 北京 |     1 |
    |  1 | 中国人民大学       | 北京 |     1 |
    +----+--------------------+------+-------+
    18 rows in set
    
    按照自己的想象
    select * from l_school order by `order` desc limit 0,13;
    应该取出的是这样的数据
    +----+--------------------+------+-------+
    | id | name               | area | order |
    +----+--------------------+------+-------+
    |  9 | 中国矿业大学       | 北京 |    12 |
    | 18 | 找不到我的学校     | 未知 |     2 |
    | 17 | 北京信息科技大学   | 北京 |     2 |
    | 16 | 北京语言大学       | 北京 |     2 |
    | 13 | 中国农业大学       | 北京 |     2 |
    | 12 | 中国地质大学       | 北京 |     2 |
    | 10 | 清华大学           | 北京 |     2 |
    |  6 | 北京理工大学       | 北京 |     2 |
    |  3 | 北京科技大学       | 北京 |     2 |
    |  8 | 首都师范大学       | 北京 |     1 |
    |  2 | 北京交通大学       | 北京 |     1 |
    | 15 | 北京外国语大学     | 北京 |     1 |
    | 14 | 我想去你们公司配镜 | 北京 |     1 |
    +----+--------------------+------+-------+
    13 rows in set
    但是事实却是这样的
    
    +----+------------------+------+-------+
    | id | name             | area | order |
    +----+------------------+------+-------+
    |  9 | 中国矿业大学     | 北京 |    12 |
    | 16 | 北京语言大学     | 北京 |     2 |
    | 12 | 中国地质大学     | 北京 |     2 |
    |  6 | 北京理工大学     | 北京 |     2 |
    | 13 | 中国农业大学     | 北京 |     2 |
    | 18 | 找不到我的学校   | 未知 |     2 |
    |  3 | 北京科技大学     | 北京 |     2 |
    | 17 | 北京信息科技大学 | 北京 |     2 |
    | 10 | 清华大学         | 北京 |     2 |
    | 11 | 北京大学         | 北京 |     1 |
    |  8 | 首都师范大学     | 北京 |     1 |
    |  7 | 北京航空航天大学 | 北京 |     1 |
    |  5 | 北京林业大学     | 北京 |     1 |
    +----+------------------+------+-------+
    13 rows in set
    第一次取出的数据发现和自己想象中的不一样
    如果还不死心的话咱们把剩下的数据取出来
    +----+------------------+------+-------+
    | id | name             | area | order |
    +----+------------------+------+-------+
    |  4 | 北京邮电大学     | 北京 |     1 |
    |  5 | 北京林业大学     | 北京 |     1 |
    | 11 | 北京大学         | 北京 |     1 |
    |  7 | 北京航空航天大学 | 北京 |     1 |
    |  1 | 中国人民大学     | 北京 |     1 |
    +----+------------------+------+-------+
    5 rows in set
    发下北京大学竟然出来了两次
    我想去你们公司配镜却没有显示出来!
    what fuck!究竟是为毛会这样、其实这是一个mysql的BUG
    http://bugs.mysql.com/bug.php?id=32933
    并且这个BUG出现的时间还不短了.
    这里给出解决方案!
    如下所示把语句改成join自己然后再order by limit 问题就解决了! mysql
    > SELECT a.* FROM l_school as a join l_school as b on a.id = b.id ORDER BY a.`order` desc LIMIT 0,13; +----+--------------------+------+-------+ | id | name | area | order | +----+--------------------+------+-------+ | 9 | 中国矿业大学 | 北京 | 12 | | 18 | 找不到我的学校 | 未知 | 2 | | 17 | 北京信息科技大学 | 北京 | 2 | | 16 | 北京语言大学 | 北京 | 2 | | 13 | 中国农业大学 | 北京 | 2 | | 12 | 中国地质大学 | 北京 | 2 | | 10 | 清华大学 | 北京 | 2 | | 6 | 北京理工大学 | 北京 | 2 | | 3 | 北京科技大学 | 北京 | 2 | | 8 | 首都师范大学 | 北京 | 1 | | 2 | 北京交通大学 | 北京 | 1 | | 15 | 北京外国语大学 | 北京 | 1 | | 14 | 我想去你们公司配镜 | 北京 | 1 | +----+--------------------+------+-------+ 13 rows in set ----------------------------我是可爱的分割线----------------- mysql> SELECT a.* FROM l_school as a join l_school as b on a.id = b.id ORDER BY a.`order` desc LIMIT 13,13 ; +----+------------------+------+-------+ | id | name | area | order | +----+------------------+------+-------+ | 4 | 北京邮电大学 | 北京 | 1 | | 5 | 北京林业大学 | 北京 | 1 | | 11 | 北京大学 | 北京 | 1 | | 7 | 北京航空航天大学 | 北京 | 1 | | 1 | 中国人民大学 | 北京 | 1 | +----+------------------+------+-------+ 5 rows in set 瞬间世界都恢复平静了! BUG就这么搞定了!

    测试环境mysql: 5.6.17;其他环境未测!

    本文是原创!转载需要注明本文地址及作者署名; 作者:dsphper 链接:dsphper的小窝     http://www.cnblogs.com/dsphper/p/4371968.html

  • 相关阅读:
    Linux基础篇之软件源码包安装
    11-1 网络协议和管理
    bash-2 httpd服务的源码编译安装脚本
    8-1 文本三级剑客之sed
    9-3 磁盘存储与分区
    9-2 yum,dnf和apt
    9-1 软件包管理
    bash-1 初始化CentOS系统的初始化脚本
    3-3 man手册介绍
    5-3 文件权限
  • 原文地址:https://www.cnblogs.com/dsphper/p/4371968.html
Copyright © 2011-2022 走看看