MySQL如何實(shí)現(xiàn)查詢(xún)數(shù)據(jù)并根據(jù)條件更新到另一張表?
作者個(gè)人研發(fā)的在高并發(fā)場(chǎng)景下,提供的簡(jiǎn)單、穩(wěn)定、可擴(kuò)展的延遲消息隊(duì)列框架,具有精準(zhǔn)的定時(shí)任務(wù)和延遲隊(duì)列處理功能。自開(kāi)源半年多以來(lái),已成功為十幾家中小型企業(yè)提供了精準(zhǔn)定時(shí)調(diào)度方案,經(jīng)受住了生產(chǎn)環(huán)境的考驗(yàn)。為使更多童鞋受益,現(xiàn)給出開(kāi)源框架地址:https://github.com/sunshinelyz/mykit-delay
數(shù)據(jù)案例
原本的數(shù)據(jù)庫(kù)有3張表。
- t_user :用戶(hù)表,存放用戶(hù)的基本信息。
- t_role :角色表,存放角色信息。
- t_role_user:存放角色與用戶(hù)的對(duì)應(yīng)關(guān)系。
因?yàn)闃I(yè)務(wù)邏輯的改變,現(xiàn)在要把它們合并為一張表,把t_role中的角色信息插入到t_user中。
首先獲取到所有用戶(hù)對(duì)應(yīng)的角色,以用戶(hù)ID分組,合并角色地到一行,以逗號(hào)分隔。
- SELECT t_user.id,GROUP_CONCAT(t_role.content) FROM t_user LEFT JOIN t_role_user on t_user.id = t_role_user.t_user_id LEFT JOIN t_role ON t_role_user.t_role_id = t_role.id GROUP BY t_user.id
先把查到的數(shù)據(jù)存放到了一個(gè)新建的表mid里
- INSERT into mid (t_user_id,t_role_info) SELECT t_user.id,GROUP_CONCAT(t_role.info) FROM t_user LEFT JOIN t_role_user on t_user.id = t_role_user.t_user_id LEFT JOIN t_role ON t_role_user.t_role_id = t_role.id GROUP BY t_user.id
然后將mid表的數(shù)據(jù)更新到t_user里,因?yàn)槭歉拢圆荒苡胕nsert into select from 語(yǔ)句了
- update t_user,mid set t_user.t_role_info = mid.t_role_info where t_user.id = mid.t_user_id
成功將目的地以逗號(hào)分隔的字符串形式導(dǎo)入t_user表中
說(shuō)一下用到的幾個(gè)方法,group_concat
group_concat( [DISTINCT] 要連接的字段 [Order BY 排序字段 ASC/DESC] [Separator '分隔符'] ),該函數(shù)能夠?qū)⑾嗤男薪M合起來(lái)
- select * from goods;
- +------+------+
- | id| price|
- +------+------+
- |1 | 10|
- |1 | 20|
- |1 | 20|
- |2 | 20|
- |3 | 200 |
- |3 | 500 |
- +------+------+
- 6 rows in set (0.00 sec)
以id分組,把price字段的值在同一行打印出來(lái),逗號(hào)分隔(默認(rèn))
- select id, group_concat(price) from goods group by id;
- +------+--------------------+
- | id| group_concat(price) |
- +------+--------------------+
- |1 | 10,20,20|
- |2 | 20 |
- |3 | 200,500|
- +------+--------------------+
- 3 rows in set (0.00 sec)
以id分組,把price字段去重打印在一行,逗號(hào)分隔
- select id,group_concat(distinct price) from goods group by id;
- +------+-----------------------------+
- | id| group_concat(distinct price) |
- +------+-----------------------------+
- |1 | 10,20|
- |2 | 20 |
- |3 | 200,500 |
- +------+-----------------------------+
- 3 rows in set (0.00 sec)
以id分組,把price字段的值打印在一行,逗號(hào)分隔,按照price倒序排列
- select id,group_concat(price order by price desc) from goods group by id;
- +------+---------------------------------------+
- | id| group_concat(price order by price desc) |
- +------+---------------------------------------+
- |1 | 20,20,10 |
- |2 | 20|
- |3 | 500,200|
- +------+---------------------------------------+
- 3 rows in set (0.00 sec)
insert into select from 將查詢(xún)到的記錄插入到某個(gè)表中
- INSERT INTO db1_name(field1,field2) SELECT field1,field2 FROM db2_name
要求目標(biāo)db2必須存在,下面測(cè)試一下,有兩個(gè)表,結(jié)構(gòu)如下
- select * from insert_one;
- +----+--------+-----+-----+
- | id | name | age | sex |
- +----+--------+-----+-----+
- | 1 | 冰河001 | 25 | |
- | 2 | 冰河002 | 26 | |
- | 3 | 冰河003 | 28 | |
- | 4 | 冰河004 | 30 | |
- +----+--------+-----+-----+
- 4 rows in set
- select * from insert_sex;
- +----+-----+
- | id | sex |
- +----+-----+
- | 1 | 1 |
- | 2 | 2 |
- | 3 | 1 |
- | 4 | 2 |
- +----+-----+
- 4 rows in set
從表2中查找性別數(shù)據(jù),插入到表1中
- into insert_one(sex) select sex from insert_sex;
- Query OK, 4 rows affected
- select * from insert_one;
- +----+--------+-----+-----+
- | id | name | age | sex |
- +----+--------+-----+-----+
- | 1 | 田小斯 | 25 | |
- | 2 | 劉大牛 | 26 | |
- | 3 | 鄭大錘 | 28 | |
- | 4 | 胡二狗 | 30 | |
- | 5 | | | 1 |
- | 6 | | | 2 |
- | 7 | | | 1 |
- | 8 | | | 2 |
- +----+--------+-----+-----+
- 8 rows in set
結(jié)果很尷尬,我是想要更新這張表的sex字段,而不是插入新的數(shù)據(jù),那么這個(gè)命令只適用于要把數(shù)據(jù)導(dǎo)入空表中,所以在上面的實(shí)際需要中,我建立了新表mid,利用update來(lái)中轉(zhuǎn)并更新數(shù)據(jù)
- UPDATE tb1,tb2 SET tb1.address=tb2.address WHERE tb1.name=tb2.name
根據(jù)條件匹配,把表1的數(shù)據(jù)替換為(更新為)表2的數(shù)據(jù),表1和表2必須有關(guān)聯(lián)才可以
- update insert_one,insert_sex set insert_one.sex = insert_sex.sex where insert_one.id = insert_sex.id;
- Query OK, 4 rows affected
- select * from insert_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 |
- +----+--------+-----+-----+
- 8 rows in set
成功將數(shù)據(jù)更新到insert_one表的sex字段中。
本文轉(zhuǎn)載自微信公眾號(hào)「冰河技術(shù)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系冰河技術(shù)公眾號(hào)。