mysql分页查询出现重复数据
bug复现
表结构
数据
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
查询结果
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
新查询结果
数据重复的问题解决
问题原因
就是因为在分页排序的时候,排序字段的值出现重复,就会导致分页结果不正确。因为sql多个字段排序,先按第一个排序字段排序,如果第一个排序字段的值相等,则按第二个排序字段排序,以此类推…
所以尽量使用值唯一的字段进行排序,如果无法避免,则使用值唯一的字段(例如时间戳)充当第二个排序字段。