精华内容
下载资源
问答
  • mysql 分页查询出现重复数据问题排查mysql 分页查询出现重复数据问题分析定位问题解决方案 mysql 分页查询出现重复数据 2019的最后一天,才发现今年快过去了,就想着写点东西纪念一下,而且正好昨天项目上遇见一个让...

    mysql 分页查询出现重复数据问题排查

    mysql 分页查询出现重复数据

    2019的最后一天,才发现今年快过去了,就想着写点东西纪念一下,而且正好昨天项目上遇见一个让我感到很奇怪的问题,一个简单的分页查询居然出现问题了,让人难以置信啊,但是问题就是出现了。所以现在就将我对这件事的问题排查过程做一个简单的记录。希望能帮助到大家。顺便方便自己做一个遇到问题的记录吧!

    问题分析定位

    在测试提供的测试用例以后,我测试了一下,在查第二页和第三页的数据里面确实有重复的数据,这真的很神奇。
    1.我的第一反应就是分页插件有问题,所以将每次请求的sql语句打印出来看一下,发现没啥问题啊。这就很尴尬啊。
    2.然后就不用分页,将分页干掉,然后查询出来整体数据,发现没啥问题,那就表明出现问题的地方在分页上面。但是问题有出来了,我大mysql的分页语句limit会有问题么?
    3.问题出现的地方找到了,发现问题,那就要去解决。然后经过查询资料和百度了一下,发现这个问题是我们 order by 语句与limit分页语句组合在一起出现了问题

    问题解决方案

    1. 因为我们在使用order by 字段时,如果这个排序字段会有相同的值,这个时候与limit组合以后就会出现数据重复现象。那这是为啥呢?经过了解,这个问题是在mysql5.6以后才会出现,mysql5.5不会出现。这是由于mysql5.6做了优化,将排序方法改成了堆排序,堆排序每次请求的结果都会不一致。
    2. 这个问题我的解决方式如下:
    原来的语句:
    	select * from pd_a order by xgsj limit 10
    修改以后的语句:
    	select * from pd_a order by xgsj,id limit 10
    
    在回出现重复的排序字段后面在加上一个不会出现重复的字段做一个联合排序。这样就可以解决重复数据问题。
    

    结束语
    2019年马上就要过去了,祝愿大家2020年心想事成。

    展开全文
  • 关于Hibernate查询出现重复数据的问题和解决方案

    首先我说明一下我遇到的情况,以便正在阅读本文的你可以决定是否需要继续看下去:

    假设我有一张表,里面有4个字段,分别叫做ABCD,主键是A,对应的我有一个pojo和一个hbm文件,pojo没什么,hbm文件里的<id>标签对应的却是B(也许你说怎么会有这种情况,其实实际情况是我在一个视图里遇到的这个问题,那里可不只有4个字段,我这么写是希望你能最快的理解).

    好的,现在问题来了.....我使用了B作为条件查询了这张表,姑且我们定义这个条件为B=1,我的表里符合这个条件的数据有2条,当然它们的A字段的值是不同的(一个A=1,一个A=2),查询的结果是:两条一模一样的数据(也就是两条都是A=1或者A=2).


    前面我描述了问题的现象,如果你遇到的和我一样,你可以继续看下去,或许你已经在我上面的描述里看出了问题所在.是的,就是因为hbm里的主键设置,由于<id>设置成了不唯一字段,而Hibernate认为它是唯一的,导致了查询出的两条数据有相同的B字段的值时,Hibernate直接复用了第一条查出的数据,因为它认为第二条既然主键都相同了,那其它的也一定一样.


    原因既然解释了,解决方案就是:

    1.找出你这个实体真正的唯一字段,将其标记为<id>(切记将<id>这个标签放在hbm文件其他<property>之前,否则...你肯定会这么做的)

    2.使用联合主键,这个我没试,网上例子也很多,搜索一下Hibernate联合主键,你就有答案了.


    好了,如果本文对你有些帮助,就在下面回复一下,让我知道我写的东西没有白费.或者你有什么问题,也可以留下.

    拒做伸手党,从我做起!

    展开全文
  • 但是一关联查询(不连接也是)就会显示好多好多一样的数据, SELECT b.id, b.contractid, b.prjname, b.prjmanager, b.budgetamount, b.ownerorg, b.jlorg, b.settleprinciple, b.remark, b....
  • QueryDsl与SpringDataJPA实现分页级联查询出现重复数据欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表...

    QueryDsl与SpringDataJPA实现分页级联查询出现重复数据

    1.需求

    项目中资源交换任务实现多表级联查询。
    两表一对多关系,需要多字段查询。

    2.界面

    在这里插入图片描述

    3.业务代码

    QueryDsl提供了对JPA,SQL,Collection,MongoDB等不同类型查询的实现。
    这里讲解和SpringDataJPA集成实现多表分页级联查询。

    @Override
        public Page<DirExchangeCfgDetailDto> searchDetailByPage(Pageable pageable, MultiValueMap<String, String> parameters) {
            if (pageable.getSort().isUnsorted()) {
                pageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), QSort.by(qCfgEntity.createDate.desc(),qCfgDetailEntity.id.desc()));
            }
            Page<Tuple> tuplePage = repository.findAll(null, pageable, jpqlQuery -> jpqlQuery.from(qCfgEntity).innerJoin(qCfgDetailEntity)
                    .on(qCfgDetailEntity.configId.eq(qCfgEntity.id)).where(builderConditions(parameters)), qCfgDetailEntity,qCfgEntity);
    
            return tuplePage.map(tuple -> {
                DirExchangeCfgDetailDto cfgDetailDto =  dtoMapper.map(tuple.get(qCfgDetailEntity), DirExchangeCfgDetailDto.class);
                // 判断是否为默认任务
                if (DEFAULT_EXCHANGE_CFG_CODE.equalsIgnoreCase(tuple.get(qCfgEntity).getCfgCode())) {
                    cfgDetailDto.setIsDefault(true);
                }else {
                    cfgDetailDto.setIsDefault(false);
                }
                cfgDetailDto.setCfgName(tuple.get(qCfgEntity).getCfgName());
                cfgDetailDto.setFlowDirection(tuple.get(qCfgEntity).getFlowDirection());
                cfgDetailDto.setChangeType(tuple.get(qCfgEntity).getChangeType());
                cfgDetailDto.setCronStr(tuple.get(qCfgEntity).getCronStr());
                return cfgDetailDto;
            });
        }
    
    private BooleanBuilder builderConditions(MultiValueMap<String, String> parameters) {
            final String resourceName = parameters.getFirst("resourceName");
            final String availableStatus = parameters.getFirst("availableStatus");
            final String flowDirection = parameters.getFirst("flowDirection");
            final String changeType = parameters.getFirst("changeType");
            BooleanBuilder builder = new BooleanBuilder();
            if (StringUtils.isNotEmpty(resourceName)) {
                builder.and(qCfgDetailEntity.resourceName.eq(resourceName));
            }
            if (StringUtils.isNotEmpty(availableStatus)) {
                builder.and(qCfgDetailEntity.availableStatus.eq(availableStatus));
            }
            if (StringUtils.isNotEmpty(flowDirection)) {
                builder.and(qCfgEntity.flowDirection.eq(flowDirection));
            }
            if (StringUtils.isNotEmpty(changeType)) {
                builder.and(qCfgEntity.changeType.eq(changeType));
            }
            return builder;
        }
    

    主要调用JPQLQuery的方法,将结果存放到一个Tuple的多元组中.相比原生sql,简单清晰了很多。
    多表投影查询示例:
    在这里插入图片描述
    把集合封装成Page返回。

    4.重复数据问题

    当设置交换任务为主表(一对多表中的多项表)进行多表映射查询时,会出现重复的返回数据。
    在这里插入图片描述
    发现问题出现在QueryDsl执行编译好的sql语句,看到sql语句关联变成了cross join交叉查询,无论是left join还是其他是同样情况。
    在这里插入图片描述
    解决方法需要设交换方案表(一对多表中的单项对应表)为主表,交换位置。
    在这里插入图片描述
    编译sql语句正常。
    在这里插入图片描述

    5.总结

    当遇到复杂、投影、动态查询时我们可以考虑使用QueryDSL做开发。以上方案可以解决大多数持久层开发问题。在使用SpringDataJPA和QueryDSL实现多表关联级联查询时,注意将一对多单项关联表设为主表进行查询。

    展开全文
  • 先放一条 重复数据 的脏SQL SELECT O.ID AS ID,O.NAME AS NAME,COUNT(C.ID) AS CLASS_NUM FROM T_BASE_ORGANIZATION O LEFT JOIN T_XSXX_CLASSINFORMATION C ON O.ID = C.FACULTY_ID LEFT JOIN T_SZDW_...

    先放一条 重复数据 的脏SQL

    SELECT O.ID AS ID,O.NAME AS NAME,COUNT(C.ID) AS CLASS_NUM FROM T_BASE_ORGANIZATION O
    LEFT JOIN T_XSXX_CLASSINFORMATION C ON O.ID = C.FACULTY_ID
    LEFT JOIN T_SZDW_CLASSMEETING_PLAN P ON C.ID = P.CLASS_ID
    WHERE C.GRADE = 2010
    GROUP BY O.ID,O.NAME,O.ORDERS
    ORDER BY O.ORDERS
    

    这表结构是:
    T_BASE_ORGANIZATION 学院表
    T_XSXX_CLASSINFORMATION 班级表
    T_SZDW_CLASSMEETING_PLAN 班会表
    一个学院 多个班级
    一个班级 多个班会
    总之引发查询出重复数据就是因为,表之间关联的关系不是一对一的而是一对多,从而导致数据重复。
    解决方式

    方法一:在 GROUP BY 加上(多表的外键) C.ID
    SELECT O.ID AS ID,O.NAME AS NAME,COUNT(C.ID) AS CLASS_NUM FROM T_BASE_ORGANIZATION O
    LEFT JOIN T_XSXX_CLASSINFORMATION C ON O.ID = C.FACULTY_ID
    LEFT JOIN T_SZDW_CLASSMEETING_PLAN P ON C.ID = P.CLASS_ID
    WHERE C.GRADE = 2010
    GROUP BY O.ID,O.NAME,O.ORDERS,C.ID
    ORDER BY O.ORDERS
    
        
    
    方法二:在返回结果数据的 地方加上DISTINCT函数, COUNT(DISTINCT(C.ID))
    SELECT O.ID AS ID,O.NAME AS NAME,COUNT(DISTINCT(C.ID)) AS CLASS_NUM FROM T_BASE_ORGANIZATION O
    LEFT JOIN T_XSXX_CLASSINFORMATION C ON O.ID = C.FACULTY_ID
    LEFT JOIN T_SZDW_CLASSMEETING_PLAN P ON C.ID = P.CLASS_ID
    WHERE C.GRADE = 2010
    GROUP BY O.ID,O.NAME,O.ORDERS
    ORDER BY O.ORDERS
    
    
    
      
    
    
    
    方法三:在做left join、right join、inner join的时候将 关联的表先DISTINCT(外键) 子查询一遍    
    SELECT O.ID AS ID,O.NAME AS NAME,COUNT(C.ID) AS CLASS_NUM FROM T_BASE_ORGANIZATION O
    LEFT JOIN T_XSXX_CLASSINFORMATION C ON O.ID = C.FACULTY_ID
    LEFT JOIN (SELECT DISTINCT(Z.CLASS_ID) FROM T_SZDW_CLASSMEETING_PLAN Z ) P ON C.ID = P.CLASS_ID
    WHERE C.GRADE = 2010
    GROUP BY O.ID,O.NAME,O.ORDERS
    ORDER BY O.ORDERS
    

    不推荐 使用方法一
    ORDER BY 函数 影响范围广。
    推荐使用方法一
    子查询 作用范围小,不影响整体SQL。

    展开全文
  • 项目场景: 数据库查询语句是工作中经常用到的 问题描述: 多表关联查询时使用GROUP_CONCAT会有重复字段 如图: 解决方案: 加distinct去重
  • 一个客户表,一个车辆表,车辆表关联的有客户表的id,现在客户表有重复的数据,怎么写一个sql,把车辆表关联的客户的id更新为重复数据中的最小的id
  • 多表关联出现重复数据原因

    千次阅读 2017-04-11 17:34:00
    多表联合查询的时候,可能会产生多条重复数据出现的原因: 1.可能是你用来进行 join的列,具有重复数据。 今天下午在写sql的时候,由于没有注意到该列的值并不是唯一的,所以导致查询出来的有N条重复数据 ...
  • EF 查询视图出现重复数据

    千次阅读 2019-04-22 19:39:00
    这样查询是,延迟加载机制,才知道哪些需要重新从数据库中拿而不是缓存中。 在思考:实体键的字段可以不是某个表的主键!?只要能确保唯一性行,其实“实体键的组合”也相当于“唯一索引”了。 总结:在模型中,...
  • select t.id,tc.create_date replenishmentTime,group_concat(tc.amount) "补录金额",group_concat(tc.create_date) "补录时间" from t_order t LEFT JOIN t_charge_...结果出现重复,暂未解决。
  • 如果要去重,统计数量,就用DISTINCT SELECT count(DISTINCT s.id) from t_ss s LEFT JOIN t_kk k on s.id=k.sid 参考:https://www.pianshen.com/article/67551321835/
  • left join出现重复数据解决方法

    万次阅读 2018-06-05 17:06:00
    三表链接查询发现返回的结果成倍的返回...捡重点说,总之引发查询重复数据就是因为,表之间关联的关系不是一对一的,可能是一对多的所以会把那张多的表数据也就查询出来,导致数据重复。解决方法:group by 字段1...
  • SQL 查询重复数据,多字段联合重复

    千次阅读 2019-06-01 09:47:40
    SELECT * FROM pagelist a WHERE ((SELECT COUNT(*) FROM pagelist WHERE ntitle = a.ntitle) >...--查询重复数据 Delete from pagelist Where ID Not In (Select Max(ID) From pagelist Gr...
  • mybatis 多表关联查询时,一般建议还是使用把需要关联的表的pojo添加到主表对应的pojo中作为它的属性,这样在mapper.xml文件中可以使用assacition(一对一查询),或者colletion(一对多查询)来使用resultMap作为输出...
  • oracle左连接查询出现数据重复

    千次阅读 2013-06-03 10:22:24
    使用左连接时,查出来的数据全部都一样的,其得到的值为笛卡尔积出现 n:n 的关系,如:left join pr_stu_elective pse on t.stu_id=pse.fk_stu_id 出现该情况的原因是因为pse表中的fk_stu_id不能唯一标识pse表中的...
  • 捡重点说,总之引发查询重复数据就是因为,表之间关联的关系不是一对一的,可能是一对多的所以会把那张多的表数据也就查询出来,导致数据重复。 解决方法:group by 字段1   即:(左表字段:右表字段=1:多时...
  • left join 关联查询 一对多 重复数据处理 -- 修改前sql SELECT DISTINCT a.QYMC, a.XYDM, a.DZ, a.FW, a.XKZBH, a.JGJG, a.FZJG, a.QFR, a.FZRQ_DATE, a.YXQZ_DATE, a.TYPE, c.facilityName, c....
  • 写出不必要的主键重复数据说明你对业务或者SQL关联的理解有问题 SQL最重要的一块语法就是各种关联 inner join 和 left join 是最常用的 如果没能深入理解SQL查询 就会写出一些有重复关联查询 1 select ...
  • Oracle查询表里重复数据

    万次阅读 2018-12-21 11:01:15
    一、查询结果只显示重复的字段 1. 查询重复的单个字段(group by) select 重复字段A, count(*) from 表 group by 重复字段A having count(*) > 1 2.查询重复的多个字段(group by) select 重复字段A, ...
  • 目的:根据图书的发布地区查询图书信息实现步骤:1 实体配置one: 图书信息 bookmany: 地区信息 bookarea实体映射,单向映射 book 中增加 area 的集合 并设置 @JoinColumn(name="bookid")@OneToMany bookarea中不...
  • !... 我想取出的效果是这两条: 10.5.5.245 node3 kube-node3 34.0% 89.0% 2019-05-16 10:40:18 ...10.5.5.245 node3 kube-node3 34.0% 96.0% 2019-05-...我要怎么写sql语句,我上面的语句似乎是错误的,因为出现了4条。
  • 因为ebankdata表里的accno字段是有重复的,关联查询的统计的数目不对 使用左连接查询写的语句报错了 select b.idbranch,count(case when b.billmode = '1' then b.accno end) as issueBill from param_bank a,ebs_...
  • sql左连接出现重复数据

    千次阅读 2018-11-12 14:28:00
    情况说明:只需左表数据,右表数据只作为条件存在,左表数据与右边有1:n关系,左连接出现重复数据 原因分析:由于1:n关系,右边数据连接后处于隐藏状态(类似),实际上数据未重复,由于只显示左边数据,就形成了...
  • SQL两个表连接查询去掉重复数据的方法:在where条件中用not in筛选掉从另一个表中查出的重复的数据 select * from ZHBG_HYSGL_XXGL_SUB where LHMC not in (select b.LHMC from ZHBG_HYSGL_XXGL_QXYD b where...
  • 多表联查,如果连接字段在副表有重复数据,最后查出来的结果也会重复
  • 1.数据库表建联合主键; 2.数据库表建唯一约束; 3.查询和插入放在同一个同步代码块中; 4.查询时锁表; 转载于:https://www.cnblogs.com/RoyalBlue/p/10836715.html...
  • 创建两个表 执行下列查询语句 ...显然 person表中的数据出现了两次 ,left join 以主表为主 ,我们在今后的开发要注意类似的问题 执行下面的语句也是同样的效果 SELECT * from persona ,people...
  • 今天在写多表关联查询的sql语句时,出现查询出的记录有重复的现象,尽管更改了内联,左右外连接,还是会出现重复的记录,查询出的结果就像下面这样: 下面是我原来的sql语句: SELECT * FROM `students` a left ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 433,310
精华内容 173,324
关键字:

关联查询出现重复数据