您的位置:首页 > 编程语言 > PHP开发

从Yii框架分页数据“丢失”到MySQL的ORDER BY和LIMIT子句

2015-11-20 15:45 656 查看
之前同事反映我做的实验安排系统在翻页时某些记录无法看到,而个别记录在两页重复出现。一开始我以为可能我对Yii不够了解,使用不对或者Yii存在某个Bug。今天测试并修改《细说PHP》第2版(高洛峰)中的books实例时,才发现这个可能是MySQL的“Bug”。查阅了网友的一些情况,发觉这个问题早就存在。由于对MySQL的执行机制不了解,也没有足够精力来探究,所以暂时把现象罗列如下:

附参考网友的资料:
http://blog.sina.com.cn/s/blog_705cc5dd01012ehb.html 这位网友遇到问题比较早,也给出了“绕过去”的办法
http://blog.csdn.net/tsxw24/article/details/44994835 这位网友分析比较到位,也给出了“绕过去”的办法
http://phyeas.iteye.com/blog/317844 这位网友的解释可能值得商榷

我的数据表为:

CREATE TABLE IF NOT EXISTS `books` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`bookname` varchar(80) NOT NULL COMMENT '图书名',

`publisher` varchar(60) NOT NULL COMMENT '出版社',

`author` varchar(20) NOT NULL COMMENT '作者',

`price` double(5,2) NOT NULL DEFAULT '0.00' COMMENT '价格',

`ptime` int(11) NOT NULL COMMENT '出版时间',

`pic` char(24) NOT NULL COMMENT '图片',

`detail` text NOT NULL COMMENT '介绍',

PRIMARY KEY (`id`),

KEY `bookname` (`bookname`,`publisher`,`price`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='图书表' AUTO_INCREMENT=38 ;

INSERT INTO `books` (`id`, `bookname`, `publisher`, `author`, `price`, `ptime`, `pic`, `detail`) VALUES

(1, 'PHP', '电子工业', '高某某', 79.90, 0, '', '与PHP相关的图书'),

(8, '夏洛的网', '中国进出口总公司', '澳大利亚人', 99.21, 1447741902, '20151117143142_753.jpg', '这是一本关于蜘蛛和猪的故事'),

(3, 'ASP', '电子工业', '峰某某', 30.00, 0, '', '与ASP相关的图书'),

(7, '图书名称111', '电子工业', '张三', 34.23, 1447736675, '20151117130435_233.png', '图书介绍'),

(15, 'PHP', '电子工业', '高某某', 80.00, 0, '', '与PHP相关的图书'),

(11, '指环王', '中国进出口公司', '老外', 150.50, 1447919964, '20151119155924_930.png', '这是一部神奇的书'),

(16, 'JSP', '人民邮电', '洛某某', 50.00, 0, '', '与JSP相关的图书'),

(17, 'ASP', '电子工业', '峰某某', 30.00, 0, '', '与ASP相关的图书'),

(20, '探秘阿兹特克', '郑州:中州古籍出版社', '牛建军编著', 37.00, 1447998015, '', '本书内容包括:鹰、蛇、仙人掌的启示,阿兹特克的历史,阿兹特克社会,阿兹特克的宗教,阿兹特克的军事,阿兹特克的城市和建筑,阿兹特克文明,阿兹特克的文学艺术等。 '),

(21, '博爱圣雄 姆·克·甘地自传', '长春:时代文艺出版社', '(印度)姆·克·甘地著;吉力译', 38.00, 1447998015, '', '无'),

(22, '20世纪军政巨人百传 博爱圣雄 姆·克·甘地自传', '长春:时代文艺出版社', '(印)姆·克·甘地著;吉力译', 39.00, 1447998015, '', '本书是甘地的自传,讲述了他的成长、思想演变过程以及他对一生传播和贯彻的“非暴力不合作运动”的理解。'),

(23, '世界上最迷人的100个童话', '北京:人民文学出版社', '(德)克·施特里希选编', 40.00, 1447998015, '', '无'),

(25, '印度通史 第1册', '北京:商务印书馆', '恩·克·辛,阿·克·班纳吉著', 42.00, 1447998015, '', '无'),

(26, '发动机燃料润滑油与液体 下', '北京:燃料工业出版社', '(苏联)克·克·伯包克,叶·格·谢米尼多', 43.00, 1447998015, '', '无'),

(28, '迪克与哈克', '北京:北京教育出版社', '北京百视文化传媒有限公司著', 35.00, 1447998128, '', '本系列图书根据于201年3月开始在北京电视台卡酷频道滚动播出的动画片《我的朋友猪迪克》而编写。故事发生在一个叫做妙妙的美丽小镇,这里居住着六个性格迥异的小朋友,分别是谦虚温和的小猪“迪克”、骄傲的富家小猫“猫牙”、狂热的侦探迷小狗“大罗”、喜欢健身追求力量的小牛“麦黄”、人见人爱的乖乖女小猴子“梦琪”以及梦想成为“小公主”的小鸡“甜甜”。他们一起在妙妙幼儿园...'),

(29, '斯洛伐克民间故事精选', '北京:新华出版社', '(斯)克·达什科娃(Prerozprav', 36.00, 1447998128, '', '斯洛伐克文学信息中心斯文学对外传播部赞助出版:本书精选了斯洛伐克民间故事29个,其中包括“十二个月的故事”、“孤儿”、“老牧羊犬与狼”等故事。 '),

(31, '博爱圣雄 姆·克·甘地自传', '长春:时代文艺出版社', '(印度)姆·克·甘地著;吉力译', 38.00, 1447998128, '', '无'),

(32, '20世纪军政巨人百传 博爱圣雄 姆·克·甘地自传', '长春:时代文艺出版社', '(印)姆·克·甘地著;吉力译', 39.00, 1447998128, '', '本书是甘地的自传,讲述了他的成长、思想演变过程以及他对一生传播和贯彻的“非暴力不合作运动”的理解。'),

(33, '世界上最迷人的100个童话', '北京:人民文学出版社', '(德)克·施特里希选编', 40.00, 1447998128, '', '无'),

(34, '印度通史 第2、3册', '北京:商务印书馆', '(印度)恩·克·辛哈,阿·克·班纳吉著', 41.00, 1447998128, '', '无'),

(35, '印度通史 第1册', '北京:商务印书馆', '恩·克·辛,阿·克·班纳吉著', 42.00, 1447998128, '', '无'),

(37, '嵌入式系统原理、设计及开发', '北京:清华大学出版社', '(印)施部·克·威著', 44.00, 1447998128, '', '本书浓墨重彩地描述嵌入式系统基础知识、详细讲解嵌入式硬件与固件设计、开发以及集成步骤,透彻分析嵌入式系统开发的管理方法。 ');







和网友的结果一样,被排序的字段为bookname,而ID为25和35的记录书名相同,结果分页显示时,ID为35的记录死活不出来,而ID为25的记录出现2次。如果把ORDER BY bookname DESC换成升序排列,即ORDER BY bookname ASC,则分页显示时,每条记录都可以看到,没有漏掉任何记录。从这个特点来说,出现记录同时重复显示和“丢失”的条件是被排序的字段值相同,并且正好发生在前一页尾部和后一页开头的情况。

根据网友的思路进行修改,如





即,排序字段增加后,可以看到ID为35的记录了

另一个方法:





即先排序得到子集t,从t分段获取就不会出现数据“丢失”的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: