繞過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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM