MySQL divides the data separated by commas into multiple rows, and then merges them into one row after updating.
1. As shown in the figure, replace F_G2 of TEST1 with F_G2 of TEST2, and update F_G3 at the same time.
2. SQL of two test tables
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. First divide F_G2 of TEST1 and convert rows to columns.
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. Query and merge new values according to the related table
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. Update F_G2 and F_G3 of TEST1 to the newly merged values.
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;