暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL分页时出现的数据重复问题

原创 编程经验共享 2023-06-12
488

作为后端开发,分页是我们必备的技能。比如商品列表就需要分页,每页10条左右。但是我在写SQL时不注意可能会导致数据重复,主要原因是排序字段的内容重复导致排序异常。

准备表及数据:

CREATE TABLE `products` (
  `id` int(11) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  `name` varchar(45) NOT NULL DEFAULT '' COMMENT '产品名称',
  `product_no` varchar(32) NOT NULL COMMENT '产品编号',
  `sort_weight` int(11) NOT NULL DEFAULT '0' COMMENT '排序(越大越靠前)',
  `status` tinyint(2) NOT NULL DEFAULT '0' COMMENT '状态(0正常)'
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='定制产品';

INSERT INTO products(`name`,`product_no`,`sort_weight`,`status`)
VALUES ('测试商品1','11111',111,1),('测试商品2','2222',222,1),('测试商品3','3333',3333,1),
('测试商品4','4444',4444,1),('测试商品5','55555',55555,1),('测试商品6','666',6666,1),('测试商品7','77777',7777,1),
('测试商品8','8888',8888,1),('测试商品9','999',9999,1),('测试商品111','11111',111,1),('测试商品12','1221',12121,1),
('测试商品4','4444',4444,1),('测试商品5','55555',55555,1),('测试商品6','666',6666,1),('测试商品7','77777',7777,1),
('测试商品4','4444',4444,1),('测试商品5','55555',55555,1),('测试商品6','666',6666,1),('测试商品7','77777',7777,1),
('测试商品4','4444',4444,1),('测试商品5','55555',55555,1),('测试商品6','7777',7777,1),('测试商品7','77777',7777,1);
复制

测试实际结果:

我们先来查询第一页的数据看看:

看上去好像没有什么问题,我们再来查询第二页的数据:

我们发现有时候第二页里面会返回第一页里面的商品,这个bug的主要原因是排序字段【sort_weight】出现重复的值,即大家的排序是一样的,导致MySQL第二次查询时不知道把这些重复的值如何排序。

解决问题

要解决这个问题,我们可以在排序的字段中添加其他排序字段,比如主键【id】。就如同这个SQL:

SELECT * FROM products WHERE status=1 ORDER BY sort_weight DESC,id desc LIMIT 11,10;
复制

 

希望这篇文章可以帮到正在阅读的你,如果觉得此文对你有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

欢迎关注我的公众号【编程经验共享】,第一时间一起学习新知识!

————————————————————————————
公众号:编程经验共享
墨天轮:https://www.modb.pro/u/545037
个人博客:https://www.motui8.cn/
————————————————————————————

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论