MySQL将字段值逗号分隔的数据分成多行,更新后,再合并为一行
1、如图把TEST1的F_G2替换成TEST2的F_G2,同时更新F_G3
2、两个测试表的sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `TEST1`;
CREATE TABLE `TEST1` (
`F_G1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`F_G2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`F_G3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`F_G4` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
PRIMARY KEY (`F_G1`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
INSERT INTO `TEST1` VALUES ('1', '1', '', '备注1');
INSERT INTO `TEST1` VALUES ('2', '1,2', '', '备注1');
INSERT INTO `TEST1` VALUES ('3', '1,3', '', '备注1');
INSERT INTO `TEST1` VALUES ('4', '2,3', '', '备注1');
INSERT INTO `TEST1` VALUES ('5', '3', '', '备注1');
INSERT INTO `TEST1` VALUES ('6', '2,3,4', '', '备注1');
INSERT INTO `TEST1` VALUES ('7', '1,3,4', '', '备注1');
DROP TABLE IF EXISTS `TEST2`;
CREATE TABLE `TEST2` (
`F_G1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`F_G2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`F_G3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`F_G4` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
PRIMARY KEY (`F_G1`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
INSERT INTO `TEST2` VALUES ('1', '01', '生活', '1');
INSERT INTO `TEST2` VALUES ('2', '02', '金钱', '2');
INSERT INTO `TEST2` VALUES ('3', '03', '生命', '3');
INSERT INTO `TEST2` VALUES ('4', '04', '时间', '4');
SET FOREIGN_KEY_CHECKS = 1;
3、先将TEST1的F_G2进行分割,行转列
SELECT
a.F_G2,
substring_index( substring_index(a.F_G2,',',b.help_topic_id + 1),',' ,- 1 ) AS new_F_G2
from
(select F_G1,F_G2,F_G3,F_G4 from TEST1 where F_G2 like '%,%') a
join mysql.help_topic b ON
b.help_topic_id < ( length(a.F_G2) - length(REPLACE (a.F_G2, ',', '')) + 1 );
4、根据关联表,查询合并新值
select
A.*,
TEST2.*,
group_concat(TEST2.F_G2) NEW_HB_F_G2,
group_concat(TEST2.F_G3)NEW_HB_F_G3
from (
SELECT
a.F_G1,
a.F_G2,
a.F_G3,
a.F_G4,
substring_index( substring_index(a.F_G2,',',b.help_topic_id + 1),',' ,- 1 ) AS new_F_G2
from (select F_G1,F_G2,F_G3,F_G4 from TEST1 where F_G2 like '%,%') a
join mysql.help_topic b ON
b.help_topic_id < ( length(a.F_G2) - length(REPLACE (a.F_G2, ',', '')) + 1 )
)A
left join TEST2 on TEST2.F_G4 = A.new_F_G2
group by A.F_G1;
5、把TEST1的F_G2和F_G3更新成新合并的数值
UPDATE (
select
A.F_G1,
group_concat(TEST2.F_G2) NEW_HB_F_G2,
group_concat(TEST2.F_G3)NEW_HB_F_G3
from (
SELECT
a.F_G1 F_G1,
a.F_G2,
substring_index( substring_index(a.F_G2,',',b.help_topic_id + 1),',' ,- 1 ) AS new_F_G2
from (select F_G1,F_G2,F_G3,F_G4 from TEST1 where F_G2 like '%,%') a
join mysql.help_topic b ON
b.help_topic_id < ( length(a.F_G2) - length(REPLACE (a.F_G2, ',', '')) + 1 )
)A
left join TEST2 on TEST2.F_G4 = A.new_F_G2
group by A.F_G1
) B ,TEST1 C SET C.F_G2 = B.NEW_HB_F_G2,C.F_G3 = B.NEW_HB_F_G3 WHERE B.F_G1 = C.F_G1;