MySQL合并两个VARCHAR列并删除重复词的实现方法
解决方案:合并两列并移除重复出现的单词
根据你的需求,我们需要把col_name1和col_name2中的单词合并到col_name3,但只保留那些只在其中一列出现的单词(也就是去掉在两列都重复的单词)。下面是针对MySQL的具体实现方案:
1. 确认表结构和测试数据
假设你的表名为your_table,先创建并插入你提供的测试数据:
CREATE TABLE your_table ( id INT, col_name1 VARCHAR(255), col_name2 VARCHAR(255), col_name3 VARCHAR(255) ); INSERT INTO your_table VALUES (1, 'hello world', 'hello test', ''), (2, 'hello from my sql fiddle', 'hello my sql', '');
2. 执行更新语句
使用以下SQL更新col_name3,实现合并去重的需求:
UPDATE your_table t SET col_name3 = ( SELECT GROUP_CONCAT(DISTINCT word SEPARATOR ' ') FROM ( -- 拆分col_name1的所有单词 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.col_name1, ' ', n.n), ' ', -1) AS word FROM ( SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 -- 如果单词数量更多,可继续添加数字 ) n WHERE n.n <= LENGTH(t.col_name1) - LENGTH(REPLACE(t.col_name1, ' ', '')) + 1 UNION ALL -- 拆分col_name2的所有单词 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.col_name2, ' ', n.n), ' ', -1) AS word FROM ( SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 ) n WHERE n.n <= LENGTH(t.col_name2) - LENGTH(REPLACE(t.col_name2, ' ', '')) + 1 ) AS combined_words GROUP BY word HAVING COUNT(*) = 1 -- 只保留仅在一列出现的单词 );
3. 验证结果
执行完更新后,查询表数据:
SELECT * FROM your_table;
会得到你期望的结果:
+----+----------------------------+--------------------+--------------+ | id | col_name1 | col_name2 | col_name3 | +----+----------------------------+--------------------+--------------+ | 1 | hello world | hello test | world test | | 2 | hello from my sql fiddle | hello my sql | from fiddle | +----+----------------------------+--------------------+--------------+
补充说明
- 数字表部分:我们用
UNION ALL生成了1到7的数字,用来拆分字符串中的单词。如果字段中单词数量超过7个,只需要继续添加SELECT 8 UNION ALL SELECT 9...即可覆盖更多单词。 - 核心逻辑:先把两列的单词拆分成单独的行,统计每个单词在当前行的出现次数,筛选出仅出现一次的单词,最后用
GROUP_CONCAT合并成空格分隔的字符串。
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

