MySQL Update inner join数据库去重,以及根据一张表的值更新另一张表
来源:互联网 发布:铁路运输数据 编辑:程序博客网 时间:2024/05/22 00:26
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_infowhere id in (select instru_mid from tb_instruments_info )UNION select * from tb_instrument_mapping_infowhere id in (select major_id from tb_instruments_info )UNION select * from tb_instrument_mapping_infowhere id in (select pro_id from tb_instruments_info )
!# 删除原来的基础数据表drop table tb_instrument_mapping_info!#把临时表temp重命名为基础数据表rename table temp to tb_instrument_mapping_infoselect * 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=3GROUP BY mapping_nameHAVING 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 t1LEFT JOIN tb_instrument_mapping_info c on t1.pro_id=c.id) t3INNER JOIN (select * from tb_instrument_mapping_info where mapping_type=3GROUP BY mapping_nameHAVING COUNT(mapping_name)>1) t2ON t3.mapping_name = t2.mapping_name
4.更新查询的重复数据,使得在mapping_name相同的同一类型数据,ID一致
思路:根据查询出的基础数据中的重复数据,如果功能数据表中的名称一致,则更新此条数据的基础数据关联字段值
SQL:
update tb_instruments_info t4INNER 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 t1LEFT JOIN tb_instrument_mapping_info c on t1.pro_id=c.id) t3INNER JOIN (select id,mapping_name from tb_instrument_mapping_info where mapping_type=3GROUP BY mapping_nameHAVING COUNT(mapping_name)>1) t2ON t3.mapping_name = t2.mapping_name) t5on t4.id=t5.idset 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 Update inner join数据库去重,以及根据一张表的值更新另一张表
- 根据一张表去更新另一张表的数据
- MySQL数据库(表)的导入导出(备份和还原) mysql 根据一张表数据更新另一张表
- MySQL数据库(表)的导入导出(备份和还原) mysql 根据一张表数据更新另一张表
- mysql 一张表update另一张表
- 查询一张表的数据去更新另一张表
- 根据一张表数据update另一张表
- 将一张表的字段根据条件更新到另一张表的一个字段中去
- 复制mysql数据库的一张表到另一张表
- 两张表关联,根据一张表更新另一张表
- MySQL中update一张表到另一张表
- 根据某一条件,从一张表更新数据到另一张表的相应列
- 两张表主键相同,根据主键一张表主键更新另一张表数据的方法
- 由一张表的内容UPDATE到另一张表
- mysql根据查询条件去修改另一张表
- mysql数据库把一张表插入到另一张表
- 一张表的某列值去更新另一张表的某列值。
- MySql中用一张表的数据更新另一张表的部分数据
- mysql语句执行超时设置
- 微信刷卡支付子商户(服务商)
- 第三周项目3
- Bluetooth Remote Controller Linux Kernel Key Report Flow
- $('div').click()事件不能用
- MySQL Update inner join数据库去重,以及根据一张表的值更新另一张表
- DB2 Load命令与DB2_LOAD_COPY_NO_OVERRIDE 注册表变量
- 《Modern Python Cookbook》(Python编程范例)笔记1.2 命名
- 传输层-4、TCP协议
- 计算今年和去年的时间,一个月的都是,用来计算同比
- 2.22 网络基础
- Linux下编译安装Nginx
- bootstrap table 导出
- 自适应文字列表布局