解决MySQL中分页查询时多页有重复数据,实际只有一条数据的问题

这篇具有很好参考价值的文章主要介绍了解决MySQL中分页查询时多页有重复数据,实际只有一条数据的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 前言

有一个离奇的BUG,在查询时,第一页跟第二页有一个共同的数据。有的数据却不显示。
后来发现是在SQL排序时没用主键排序。
解决:使用主键排序
以下是我准备的举例,可以自己试试。

1 数据准备

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for goods
-- ----------------------------
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods`  (
  `id` int NOT NULL COMMENT '自增主键',
  `goods_uuid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品uuid',
  `goods_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品名',
  `warehousing_time` datetime NULL DEFAULT NULL COMMENT '入库时间',
  `in_goods` int NULL DEFAULT NULL COMMENT '是否在库',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of goods
-- ----------------------------
INSERT INTO `goods` VALUES (1, '43a0d013-142d-b1b1-d484-b7926967e9b0', '麻糕薯', '2023-07-18 08:00:00', 1);
INSERT INTO `goods` VALUES (2, 'e3dd0d6d-ae57-c307-a83d-011e5873605c', '哈密瓜', '2023-07-17 08:00:00', 1);
INSERT INTO `goods` VALUES (3, 'ff707c99-7098-80d3-9d68-e57b2b7c9a83', '鸡排骨', '2023-07-16 08:00:00', 1);
INSERT INTO `goods` VALUES (4, 'e47cc736-0934-9443-dcb2-cb25938681aa', '猪肉脯', '2023-07-15 08:00:00', 1);
INSERT INTO `goods` VALUES (5, '3400bbbe-0da4-7941-9289-26127d8de225', '牛肉干', '2023-07-14 08:00:00', 1);
INSERT INTO `goods` VALUES (6, '4505b5d1-a170-6878-2be1-c243250f56fe', '碧根果', '2023-07-13 08:00:00', 1);
INSERT INTO `goods` VALUES (7, '428865ac-b711-aa5c-8210-620b72e02a5a', '无花果', '2023-07-12 08:00:00', 1);
INSERT INTO `goods` VALUES (8, 'bdd57fcd-7d7c-8dbf-cc5b-77bfa7a82ef9', '开心果', '2023-07-11 08:00:00', 1);
INSERT INTO `goods` VALUES (9, '0c297d45-fbe4-eab7-6a09-c2b61349bca4', '杏仁', '2023-07-10 08:00:00', 1);
INSERT INTO `goods` VALUES (10, '6b7f1a48-8419-c342-e28f-644f745b8d29', '松仁', '2023-07-09 08:00:00', 1);
INSERT INTO `goods` VALUES (11, '16dc36bf-0d6e-3daf-f324-6361d3790d28', '棒棒糖', '2023-07-08 08:00:00', 1);
INSERT INTO `goods` VALUES (12, 'b4ee3289-12c9-1550-eff9-5a7a4a8b0340', '脆皮肠', '2023-07-07 08:00:00', 1);
INSERT INTO `goods` VALUES (13, '862ee658-e25a-f64b-35ce-c6c880963b38', '奥尔良', '2023-07-06 08:00:00', 1);
INSERT INTO `goods` VALUES (14, '86f7e5cd-e0c6-c459-af05-b0db5a7581eb', '汉堡', '2023-07-05 08:00:00', 1);
INSERT INTO `goods` VALUES (15, '71b64da5-bf72-1ba8-01f6-a362168d0a1e', '巧克力', '2023-07-04 08:00:00', 1);
INSERT INTO `goods` VALUES (16, 'c5c874dd-878d-5ecb-7d6f-49e6b7d55b91', '果冻', '2023-07-04 08:00:00', 1);
INSERT INTO `goods` VALUES (17, 'bac4c71c-dbaf-7d15-9058-f59d6dff04fb', '海苔', '2023-07-04 08:00:00', 1);
INSERT INTO `goods` VALUES (18, 'd8e49911-bba5-f6b2-259b-1d15f62c7a4d', '双皮奶', '2023-07-03 08:00:00', 1);
INSERT INTO `goods` VALUES (19, '9d3240a3-8614-c79a-7834-62f8a0bde671', '饼干', '2023-07-02 08:00:00', 1);
INSERT INTO `goods` VALUES (20, '8875c531-2ca4-80eb-aaa1-7f7f4a9666e7', '薯片', '2023-07-01 08:00:00', 1);

SET FOREIGN_KEY_CHECKS = 1;

解决MySQL中分页查询时多页有重复数据,实际只有一条数据的问题,数据库,mysql,性能优化,数据库

2 BUG复现

分页查询公式:分页查询–他的公式为(伪代码):[NOT] LIMIT (curPage-1)*pageSize,pageSize
执行SQL(每页4条,第1页):

SELECT
	id,
	goods_uuid,
	goods_name,
	warehousing_time,
	in_goods 
FROM
	goods 
WHERE
	in_goods = 1 
ORDER BY
	warehousing_time 
	LIMIT 0,
	4;

我们想得到的应该是时间从小到大,也就是
20 薯片
19 饼干
18 双皮奶
17 海苔
但是实际情况为:
20 薯片
19 饼干
18 双皮奶
16 果冻
解决MySQL中分页查询时多页有重复数据,实际只有一条数据的问题,数据库,mysql,性能优化,数据库

执行SQL(每页4条,第2页):

SELECT
	id,
	goods_uuid,
	goods_name,
	warehousing_time,
	in_goods 
FROM
	goods 
WHERE
	in_goods = 1 
ORDER BY
	warehousing_time 
	LIMIT 4,
	4;

我们想得到的应该是时间从小到大,也就是
16 果冻
15 巧克力
14 汉堡
13 奥尔良
实际情况为:
16 果冻
17 海苔
14 汉堡
13 奥尔良
解决MySQL中分页查询时多页有重复数据,实际只有一条数据的问题,数据库,mysql,性能优化,数据库

可以看到:第一页跟第二页都出现了id为16,name为果冻的数据。
并且id为15,name为巧克力的数据没有出现。
如果在页面上展示就会有问题。

3 解决

因为这个排序条件的数据是可以重复的,所以在查询的时候,MYSQL在排序重复数据的时候会导致数据位置不固定。
所以要使用主键去查询。
使用主键id查询,可以解决此问题。
解决MySQL中分页查询时多页有重复数据,实际只有一条数据的问题,数据库,mysql,性能优化,数据库
解决MySQL中分页查询时多页有重复数据,实际只有一条数据的问题,数据库,mysql,性能优化,数据库文章来源地址https://www.toymoban.com/news/detail-600408.html

到了这里,关于解决MySQL中分页查询时多页有重复数据,实际只有一条数据的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 怎么有效地查询MySQL表中的重复数据

    在MySQL数据库中,偶尔会遇到需要查找表中出现的重复数据的情况。这种情况下,我们可以通过编写一些SQL查询语句轻松地找到并处理这些重复行。本文将介绍一些常见的方法和技巧,帮助你有效地查询MySQL表中的重复数据。 方法一:使用COUNT()函数查询重复行 COUNT()函数是M

    2024年02月07日
    浏览(41)
  • MySQL 联表查询重复数据并删除(子查询删除记录) SQL优化

    数据库表介绍: table_a :主表(小表,表数据不可重复) table_b :流水表(大表,记录审核流水数据) 注:两表表结构大致一致,流水表增加一个审核状态的字段 业务逻辑: 主表保存唯一数据,流水表记录审核流水数据,用于后续展示,并在审核成功后插入主表,在插入流

    2023年04月08日
    浏览(62)
  • Mysql Php 推送获取随机数据解决分页重复问题

    或许你已经看过很多博主写的文章,要不就是抄袭,要不就是给你一个下面的语句,随机是随机了,但是多来两页,你会发现前面出现的数据在第三页甚至第二页就出现了 这是因为rand()机制的问题,他每次都会打乱数据给你,然后你去取的时候0-10,11-20都有可能是同一个数据

    2024年02月06日
    浏览(46)
  • 查询数据库中的重复数据记录

    ========第一篇========= 在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句: select data_guid from adam_entity_datas a where a.rowid (select min(b.rowid) from adam_entity_datas b where b.data_guid = a.data_guid) 如果表中有大量数据,但是重复数据比较少,那么可以

    2024年02月07日
    浏览(49)
  • elasticSearch 分页查询出现重复数据

            match查询默认按照评分排序,出现数据评分一致,客户端调用分页的时候,会出现数据重复错乱很严重。from size 做分页,每次都是重新加载,所以评分一致的数据,顺序有可能会变化。在分页的临界点,容易导致数据重复。  解决方法: 1. 使用不重复字段进行排

    2024年04月16日
    浏览(42)
  • 【MySQL】数据库排查慢查询、死锁进程排查、预防以及解决方法

    1.1检查慢查询日志是否开启 1.1.1使用命令检查是否开启慢查询日志: 如果是 Value 为 off 则并未开启 1.1.2开启并且查看慢查询日志: MySQL提供了慢查询日志功能,可以记录所有执行时间超过long_query_time秒的查询语句,通过分析这些慢查询可以找到数据库性能瓶颈。 启用慢查询日志

    2024年03月19日
    浏览(87)
  • mysql千万级别的数据使用count(*)查询比较慢怎么解决?

    当MySQL中的数据量达到千万级别时,使用 COUNT() 查询可能会变得比较慢。这是因为 COUNT() 会扫描整个表并计算匹配的行数,对于大表来说,这个过程可能会非常耗时。 在上图中查询一千三百多万数据耗时 28s左右。 以下是一些优化COUNT(*)查询的方法: 使用索引: 确保查询的字

    2024年02月03日
    浏览(48)
  • SQL联表查询LEFT JOIN 数据去重复

    使用left join联表查询时,如果table1中的一条记录对应了table2的多条记录,则会重复查出id相同的多条记录。 解决方法: 将查询结果作为中间表,使用group by 进行去重 如果想对group by后的数据计算count,可以将查询结果作为中间表再计算count

    2024年02月11日
    浏览(57)
  • SQL 查询表中某列字段相同的重复数据的方法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在数据库查询中,我们经常需要查找表中某列中重复的数据。本文将介绍如何使用 SQL 查询语句来查找表中某列字

    2024年02月15日
    浏览(50)
  • 使用JOIN查询数据重复,怎么办?使用count统计怎么写SQL?

    比如现在有两个表tbl_a和tbl_b,如下: tbl_a id name 1 Bruce 2 Mike 3 Angela tbl_b id a_id :-: :-: 1 1 2 1 3 2 4 3 5 3 6 3 这时候我们如果联查的话,就会出现重复数据: 这样查出来的数据就会像下面这样: id name 1 Bruce 1 Bruce 2 Mike 3 Angela 3 Angela 3 Angela 去重的方法有三种: 一、distinct 二、group

    2024年02月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包