1 问题来源

这几天在项目中遇到一个问题:由于前期设计不合理,导致后期用户录入数据时,基础数据表中有重复多余数据。如下:

出现两个 2G网络测试手机 这样类似的基础数据,直接后果就是用户在使用这个基础数据时,明明选择的是同一类型的基础数据,但是数据库中的关联ID却不一致,这在后期做统计等功能的时候带来巨大的不必要的困难,并且随着时间的增长,这样的时间开销越来越大,系统维护难度也增大。

表结构如下:

功能数据表:tb_instruments_info

基础数据表: tb_instrument_mapping_info

其中,功能数据表中的instru_mid,pro_id,major_id都关联基础数据表中的ID,上图中的 2G网络测试手机 为基础数据表中的mapping_name字段。

页面显示的mapping_name相同,但是ID却不同,从而功能表中相同名称的基础数据,但是instru_mid/pr_id/major_id却不同,所以在统计 tb_instruments_info 表中的数据的时候,会有不必要的麻烦。

解决这个问题,我想到的解决办法如下:

1. 修改代码,使得在添加基础数据的时候,如果有此项数据了之后,不能重复添加;

2. 清除基础数据表中还没有使用过的基础数据;

3. 查询出基础数据中重复多余的基础数据;

4. 根据3查询出的重复数据,在功能数据表中查询出使用了重复数据的数据;

5. 更新功能数据表中重复的数据,使得所选择的基础数据关联ID相同;

6. 更新数据之后,清除基础数据表中的冗余数据。

以下是步骤:

第一步这里不说,主要说得是后面几步数据库操作。

2 解决过程

1.清除基础数据中没有使用过的数据

思路: 建立一张中间表temp,查询出使用过的基础数据,放在temp中。

SQL:

!#查询出使用过的基础数据,并且插入到临时表temp中

create table temp

select * from tb_instrument_mapping_info

where id in (select instru_mid from tb_instruments_info )

UNION

select * from tb_instrument_mapping_info

where id in (select major_id from tb_instruments_info )

UNION

select * from tb_instrument_mapping_info

where id in (select pro_id from tb_instruments_info )

!# 删除原来的基础数据表

drop table tb_instrument_mapping_info

!#把临时表temp重命名为基础数据表

rename table temp to tb_instrument_mapping_info

select * from tb_instrument_mapping_info

2.查询出基础数据中重复的数据,并且按照mapping_name分组

思路: 基础数据中设计为不重复,所以同一类型下count(mapping_name)>1的数据为重复数据

SQL:

!#查询出类型=3的重复mapping_name数据

select * from tb_instrument_mapping_info

where mapping_type=3

GROUP BY mapping_name

HAVING COUNT(mapping_name)>1

3.在功能数据表中根据查询出使用了多余数据的功能数据

思路: 在基础数据中查询出同一类型的重复数据之后,inner join 功能数据表,即可查询出使用了重复数据的数据

SQL:

select t3.* from

(select t1.id,t1.instru_code,t1.spec_type,t1.major_id,t1.instru_mid,c.mapping_name,t1.pro_id

from tb_instruments_info t1

LEFT JOIN tb_instrument_mapping_info c on t1.pro_id=c.id) t3

INNER JOIN

(select * from tb_instrument_mapping_info

where mapping_type=3

GROUP BY mapping_name

HAVING COUNT(mapping_name)>1) t2

ON t3.mapping_name = t2.mapping_name

4.更新查询的重复数据,使得在mapping_name相同的同一类型数据,ID一致

思路:根据查询出的基础数据中的重复数据,如果功能数据表中的名称一致,则更新此条数据的基础数据关联字段值

SQL:

update tb_instruments_info t4

INNER JOIN

(select t3.*,t2.id as mpid from

(select t1.id,t1.instru_code,t1.spec_type,t1.major_id,t1.instru_mid,c.mapping_name,t1.pro_id

from tb_instruments_info t1

LEFT JOIN tb_instrument_mapping_info c on t1.pro_id=c.id) t3

INNER JOIN

(select id,mapping_name from tb_instrument_mapping_info

where mapping_type=3

GROUP BY mapping_name

HAVING COUNT(mapping_name)>1) t2

ON t3.mapping_name = t2.mapping_name) t5

on t4.id=t5.id

set t4.pro_id=t5.mpid

经过以上几步,可以得出想要的结果。

3.技术难点

1.create table Table select

根据查询出来的结果,创建一张表。此用法大多用在创建临时表,和迁移数据时使用。需注意默认值的改变。

2.update TableA inner join TableB on TableA.id=TableB.id set TableA.name=TableB.name

根据TableB中的表的值,更新TableA中对应表的值,在MySQL中使用,其他数据库没有测试。

4.其他

根据一张表的数据更新另一张表:

https://stackoverflow.com/questions/11709043/mysql-update-column-with-value-from-another-table

mysql join 去重_MySQL Update inner join数据库去重,以及根据一张表的值更新另一张表...相关推荐

  1. mysql将一个表的字段更新到另一个表中

    mysql将一个表的字段更新到另一个表中 今天遇到了这个问题 百度了一下,给出的解决方案如下 UPDATE T_CONDETAILED SET latesprice=t_temp.amount FRO ...

  2. mysql loop嵌套_MySQL中Nested-Loop Join算法小结

    数据库中JOIN操作的实现主要有三种:嵌套循环连接(Nested Loop Join),归并连接(Merge Join)和散列连接或者哈稀连接(Hash Join).其中嵌套循环连接又视情况又有两种变 ...

  3. mysql left join 中文_MySQL之LEFT JOIN问题汇总

    使用ON和WHRERE对表数据过滤 背景 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论.商城里一个货物有多少评论.一条评论有多少个赞等等.但是由于对j ...

  4. mysql inner join 索引_MySQL 在 INNER JOIN 场景的使用-爱可生

    原标题:MySQL 在 INNER JOIN 场景的使用-爱可生 本文详细介绍了 MySQL 参数 join_buffer_size 在 INNER JOIN 场景的使用,OUTER JOIN 不包含 ...

  5. mysql group by去重_MySQL本周总结——group by去重和自联结理解

    1.group by 理解: 从一个例题开始: 已知表格:Product(maker, type, model) Get the makers who produce only one product ...

  6. mysql修改库存量_mysql update 库存问题

    6 2016-02-01 23:03:08 +08:00   1 如果纯在 mysql 的场景下操作,不用内存 key-value 系统,我更倾向于用另外一种模型处理这种竞争抢购的逻辑. " ...

  7. mysql怎么升级_MySQL UPDATE 更新

    MySQL UPDATE 更新 如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQ ...

  8. mysql触发器 多数据_mysql的触发器同数据库多表的数据操作_MySQL

    CREATE TRIGGER BEFORE ON FOR EACH ROW //语句可以是任何合法的语句,包括复合语句,但是这里的语句受的限制和函数的一样 2.触发器的创建 不能给同一张表的同一个事件 ...

  9. mysql workbench 闪电_MySQL Workbench下载|可视化数据库设计建模(MySQL Workbench) 8.0 最新版-闪电下载吧...

    MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具.它是著名的数据库设计工具DBDesigner4的继任者.你可以用MySQL Workbench设计和创建新的数据库图示,建 ...

最新文章

  1. java操作跨页的word cell,利用itext 生成pdf,处理cell 跨页问题 [转]
  2. 扩增子分析QIIME2(2018.6). 1简介和安装
  3. 转载【C】堆区和栈区的区别
  4. Hive1.2.1安装
  5. c语言关键字不做标识符,C语言标识符、关键字、注释、表达式和语句
  6. mac下载安装本地mongodb
  7. 基于vue2实现省市联动
  8. 台湾大学林轩田机器学习技法课程学习笔记10 -- Random Forest
  9. oracle环境变量怎么配,oracle环境变量配置-Oracle
  10. case 逻辑java,java – 了解CaseInsensitiveComparator中的逻辑
  11. 像计算机科学家一样思考(C++)
  12. krita绘图_如何使用Krita制作动画视频
  13. prolog与python_讲解:SENG201、Software、Python,Java/c++Web|Prolog
  14. CCF-CSP-2015年9月-题解
  15. PHP友情链接检测代码
  16. 【整理学习Hadoop】Hadoop学习基础之一:服务器集群技术
  17. python3中生成图片验证码和短信验证码的程序
  18. 微信小程序-实现分享(带参数)
  19. 寒假算法训练1-J(分棍子,求最长棍子的数量,另外学习map的排序方法)
  20. 关于与kafka的爱恨交织

热门文章

  1. 如何设置苹果手表6,才能解决充电慢、掉电快问题
  2. 键盘读入不定数量的整数,判断读入的正数和负数的个数,输入0时结束 while(true),for(;;)
  3. ubuntu 20.04 安装好搜狗输入法无法输入中文,只能输入英文的问题,因为没有安装依赖
  4. win10密码忘了怎么办_OPPO A92s忘了手机密码怎么办?手机怎么解锁?
  5. ASP留言板(在一页里实现所有功能)
  6. js 面向对象编程实例
  7. Map集合(超详解)
  8. 基于SPRINGBOOT的健康饮食管理系统
  9. VUE路由去掉“#”
  10. CSDN 昵称和ID修改指引