MySQL如何实现查询数据并根据条件更新到另一张表?

 2022-10-27    319  

作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:https://github.com/sunshinelyz/mykit-delay

数据案例

原本的数据库有3张表。

  • t_user :用户表,存放用户的基本信息。
  • t_role :角色表,存放角色信息。
  • t_role_user:存放角色与用户的对应关系。

因为业务逻辑的改变,现在要把它们合并为一张表,把t_role中的角色信息插入到t_user中。

首先获取到所有用户对应的角色,以用户ID分组,合并角色地到一行,以逗号分隔。

SELECTt_user.id,GROUP_CONCAT(t_role.content)FROMt_userLEFTJOINt_role_useront_user.id=t_role_user.t_user_idLEFTJOINt_roleONt_role_user.t_role_id=t_role.idGROUPBYt_user.id

先把查到的数据存放到了一个新建的表mid里

INSERTintomid(t_user_id,t_role_info)SELECTt_user.id,GROUP_CONCAT(t_role.info)FROMt_userLEFTJOINt_role_useront_user.id=t_role_user.t_user_idLEFTJOINt_roleONt_role_user.t_role_id=t_role.idGROUPBYt_user.id

然后将mid表的数据更新到t_user里,因为是更新,所以不能用insert into select from 语句了

updatet_user,midsett_user.t_role_info=mid.t_role_infowheret_user.id=mid.t_user_id

成功将目的地以逗号分隔的字符串形式导入t_user表中

说一下用到的几个方法,group_concat

group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] ),该函数能够将相同的行组合起来

select*fromgoods;
+------+------+
|id|price|
+------+------+
|1|10|
|1|20|
|1|20|
|2|20|
|3|200|
|3|500|
+------+------+
6rowsinset(0.00sec)

以id分组,把price字段的值在同一行打印出来,逗号分隔(默认)

selectid,group_concat(price)fromgoodsgroupbyid;
+------+--------------------+
|id|group_concat(price)|
+------+--------------------+
|1|10,20,20|
|2|20|
|3|200,500|
+------+--------------------+
3rowsinset(0.00sec)

以id分组,把price字段去重打印在一行,逗号分隔

selectid,group_concat(distinctprice)fromgoodsgroupbyid;
+------+-----------------------------+
|id|group_concat(distinctprice)|
+------+-----------------------------+
|1|10,20|
|2|20|
|3|200,500|
+------+-----------------------------+
3rowsinset(0.00sec)

以id分组,把price字段的值打印在一行,逗号分隔,按照price倒序排列

selectid,group_concat(priceorderbypricedesc)fromgoodsgroupbyid;
+------+---------------------------------------+
|id|group_concat(priceorderbypricedesc)|
+------+---------------------------------------+
|1|20,20,10|
|2|20|
|3|500,200|
+------+---------------------------------------+
3rowsinset(0.00sec)

insert into select from 将查询到的记录插入到某个表中

INSERTINTOdb1_name(field1,field2)SELECTfield1,field2FROMdb2_name

要求目标db2必须存在,下面测试一下,有两个表,结构如下

select*frominsert_one;
+----+--------+-----+-----+
|id|name|age|sex|
+----+--------+-----+-----+
|1|冰河001|25||
|2|冰河002|26||
|3|冰河003|28||
|4|冰河004|30||
+----+--------+-----+-----+
4rowsinset


select*frominsert_sex;
+----+-----+
|id|sex|
+----+-----+
|1|1|
|2|2|
|3|1|
|4|2|
+----+-----+
4rowsinset

从表2中查找性别数据,插入到表1中

intoinsert_one(sex)selectsexfrominsert_sex;
QueryOK,4rowsaffected
select*frominsert_one;
+----+--------+-----+-----+
|id|name|age|sex|
+----+--------+-----+-----+
|1|田小斯|25||
|2|刘大牛|26||
|3|郑大锤|28||
|4|胡二狗|30||
|5|||1|
|6|||2|
|7|||1|
|8|||2|
+----+--------+-----+-----+
8rowsinset

结果很尴尬,我是想要更新这张表的sex字段,而不是插入新的数据,那么这个命令只适用于要把数据导入空表中,所以在上面的实际需要中,我建立了新表mid,利用update来中转并更新数据

UPDATEtb1,tb2SETtb1.address=tb2.addressWHEREtb1.name=tb2.name

根据条件匹配,把表1的数据替换为(更新为)表2的数据,表1和表2必须有关联才可以

updateinsert_one,insert_sexsetinsert_one.sex=insert_sex.sexwhereinsert_one.id=insert_sex.id;
QueryOK,4rowsaffected
select*frominsert_one;
+----+--------+-----+-----+
|id|name|age|sex|
+----+--------+-----+-----+
|1|冰河001|25|1|
|2|冰河002|26|2|
|3|冰河003|28|1|
|4|冰河004|30|2|
|5|||1|
|6|||2|
|7|||1|
|8|||2|
+----+--------+-----+-----+
8rowsinset

成功将数据更新到insert_one表的sex字段中。

  •  标签:  
  • MySQL
  •  

原文链接:https://77isp.com/post/10215.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。