当前位置: 首页 > 科技观察

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

时间:2023-03-16 10:55:23 科技观察

作者个人研发在高并发场景下提供了一个简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。开源半年多以来,已成功为十几家中小企业提供精准定时调度解决方案,经受住了生产环境的考验。为了造福更多的童鞋,这里提供一个开源的框架地址: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,因为是更新,所以不能使用insertintoselectfrom语句update_user.mirod_t_user,mirodsmid.t_role_infowhereet_user.id=mid.t_user_id以逗号分隔的字符串形式成功将目的地导入到t_user表中,下面说说使用的方法,group_concatgroup_concat([DISTINCT]需要连接的字段[OrderBYsortfieldASC/DESC][Separator'separator']),这个函数可以合并相同的行select*fromgoods;+------+------+|id|price|+------+------+|1|10||1|20||1|20||2|20||3|200||3|500|+------+------+6rowsinset(0.00sec)groupbyid,在同一行打印price字段的值,逗号分隔(默认)selectid,group_concat(price)fromgoodsgroupbyid;+------+--------------------+|id|group_concat(价格)|+------+--------------------+|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)groupbyid,一行打印price字段的值,逗号分隔,排序selectid价格倒序,group_concat(priceorderbypricedesc)fromgoodsgroupbyid;+------+--------------------------------------+|id|group_concat(priceorderbypricedesc)|+------+------------------------------------+|1|20,20,10||2|20||3|500,200|+------+-------------------------------------+3rowsinset(0.00sec)insertintoselectfrom将查询到的记录插入到表中INSERTINTOdb1_name(field1,field2)SELECTfield1,field2FROMdb2_name要求targetdb2必须存在,下面测试一下,有两个表,结构如下select*frominsert_one;+----+--------+-----+-----+|id|name|age|sex|+----+------+-----+-----+|1|冰川001|25|||2|冰川002|26|||3|冰川003|28|||4|冰川004|30||+----+--------+-----+-----+4rowsinsetselect*frominsert_sex;+----+-----+|id|sex|+----+-----+|1|1||2|2||3|1||4|2|+----+-----+4rowsinset从表2中查找性别数据,插入表1intoinsert_one(sex)selectsexfrominsert_sex;QueryOK,4rowsaffectedselect*frominsert_one;+----+--------+-----+-----+|id|姓名|年龄|性别|+----+--------+-----+-----+|1|田小四|25|||2|刘大牛|26|||3|郑大锤|28|||4|胡二狗|30|||5|||1||6|||2||7|||1||8|||2|+----+--------+-----+-----+8rowsinset结果很囧,我想更新这张表的性别字段而不是插入新数据,那么这个命令只适合空表导入数据,所以在上面的实际需求中,我新建了一个表mid,并使用update来传递更新数据UPDATEtb1,tb2SETtb1.address=tb2.addressWHEREtb1.name=tb2.name根据to条件匹配,将表1中的数据替换(更新)为表2中的数据,表1和表2必须相关updateinsert_one,insert_sexsetinsert_one.sex=insert_sex.sexwhereinsert_one.id=insert_sex.id;QueryOK,4rowsaffectedselect*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表的sexword端中本文转载自微信公众号“银禾科技”,可通过以下二维码关注。转载本文请联系冰川科技公众号。