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

原创 2015年11月20日 15:45:37

之前同事反映我做的实验安排系统在翻页时某些记录无法看到,而个别记录在两页重复出现。一开始我以为可能我对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分段获取就不会出现数据“丢失”的情况。

yii框架中findall方法取数据使用总结,包括select各种条件,where条件,order by条件,limit限制以及使用单纯sql语句query时占位符的使用等

在yii框架中可以使用映射类的find方法取出一条数据或者用findall方法取出数条数据来,那么如何按照所需条件来取数据呢,主要用到了CDbCriteria这个类,这个类是yii自带的操作数据库的支...

MySQL数据分页查询---limit、order by的使用

数据分页查询方面,mysql中没有top,替而代之的是limit关键字。对于EMPLOYEE表如下: 插入两条记录: 一、limit的使用1、取前4条数据或者:2、从第2条开始,一共取4条数据(取...
  • will130
  • will130
  • 2015年11月11日 16:55
  • 1263

[mysql] select的子句 where,group by, having, order by, limit的使用顺序及实例

-- 语法: 1 2 3 4 5 6 7 SELECT select_list    FROM table_name   [ WHERE search_con...
  • wfh6732
  • wfh6732
  • 2017年02月23日 21:13
  • 315

MySQL入门之扩展匹配符、order by、limit、union、group by、having子句

MySQL入门扩展匹配符、order by、limit、union、group by、having子句

MySQL查询子句(group by,limit,union,order by等)

Order by按照字段值进行排序,默认升序(asc)。校对规则决定排序关系。 order by 字段 升序|降序(asc|desc),Order by允许多字段排序。 指的是,先按第一个字段排序...

mysql分页出现重复数据-order by

好久没更新了。昨天项目测试报了个bug,分页列表中,第一页的数据,在第二页也存在,同时也丢失了一条数据。 于是我就上网开始扒拉扒拉。。。。昨天下午年会,于是今天周六加班搞! 原来是Sql 的问...

mysql中where,limit于order by 的使用陷阱

在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似的写法select * from 表名 order by 排序字段 limt M,N。...

MySQL学习笔记 第六讲:select语句order by、limit、distinct、union

第六讲:select语句order by、limit、distinct、union   1.order by:按照字段值进行排序        ①语法:order by 字段 升序|降序 (asc|d...
  • lhy349
  • lhy349
  • 2013年07月14日 21:00
  • 976

MySQL ORDER BY / LIMIT performance: late row lookups

转载自:http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/ My...

sql order by,desc和limit使用(mysql)

(。ŏ_ŏ) 首先我们来看一个表: 在此我们要进行排序,按降序排序,就是从大到小。然后我们只要查询前2条数据。 意思就是我们需要把这个表从大到小排序后,取前两条,那么我们就需要使用到order...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从Yii框架分页数据“丢失”到MySQL的ORDER BY和LIMIT子句
举报原因:
原因补充:

(最多只允许输入30个字)