mysql分页查询出现重复数据

文章讲述了在MySQL中,由于分页查询时排序字段值可能出现重复导致数据重复的问题。解决办法是在排序字段中添加一个唯一值字段,如时间戳,以确保分页结果的准确性。
摘要由CSDN通过智能技术生成

mysql分页查询出现重复数据

bug复现

表结构

image-20240105214403475

数据

image-20240105214551040

sql
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int(11) NOT NULL,
  `top` int(11) NULL DEFAULT NULL COMMENT '是否置顶',
  `create_time` datetime(0) NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Fixed;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (1, 1, '2024-01-01 21:33:22');
INSERT INTO `test` VALUES (2, 1, '2024-01-02 21:33:45');
INSERT INTO `test` VALUES (3, 0, '2024-01-03 21:33:54');
INSERT INTO `test` VALUES (4, 1, '2024-01-04 21:34:02');
INSERT INTO `test` VALUES (5, 1, '2024-01-05 21:34:11');
INSERT INTO `test` VALUES (6, 0, '2024-01-06 21:34:22');
INSERT INTO `test` VALUES (7, 1, '2024-01-07 21:34:31');
INSERT INTO `test` VALUES (8, 0, '2024-01-08 21:34:38');
INSERT INTO `test` VALUES (9, 1, '2024-01-09 21:34:45');
INSERT INTO `test` VALUES (10, 1, '2024-01-10 21:34:54');
分别执行分页查询语句
SELECT * FROM `test` ORDER BY top DESC limit 0,5
SELECT * FROM `test` ORDER BY top DESC limit 5,5
查询结果

image-20240105214929844

image-20240105214956000

bug

第一条sql是根据是否置顶排序查询test表的5条数据

第二条sql是根据是否置顶排序查询test表的5条数据

结果发现id=10的数据重复在查询结果中出现

解决方法

在查询语句的排序字段中再加上一个排序字段。尽量要求是当第一个排序字段重复时,值能够唯一的。

新sql
SELECT * FROM `test` ORDER BY top DESC,create_time DESC limit 0,5
SELECT * FROM `test` ORDER BY top DESC,create_time DESC limit 5,5
新查询结果

image-20240105215808660

image-20240105215827101

数据重复的问题解决

问题原因

就是因为在分页排序的时候,排序字段的值出现重复,就会导致分页结果不正确。因为sql多个字段排序,先按第一个排序字段排序,如果第一个排序字段的值相等,则按第二个排序字段排序,以此类推…

所以尽量使用值唯一的字段进行排序,如果无法避免,则使用值唯一的字段(例如时间戳)充当第二个排序字段。

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值