mySql字段内容去重
字段存放例如 “112,123,112,113” 这样得数据,通过sql查询变成“112,123,113”去重后得数据。
例如name字段数据:
结果:
1.第一步将多个名字进行拆分拆分成多个名字
SELECT a.id
, substring_index(substring_index(需要拆分的字符串, 需要拆分的符号, b.help_topic_id + 1), 需要拆分符号, - 1) AS name
FROM 表名 a
INNER JOIN mysql.help_topic b
ON b.help_topic_id < (length(需要拆分的字符串) - length(REPLACE(需要拆分的字符串, 需要拆分符号, '')) + 1)
2.再根据id分组,通过GROUP_CONCAT()聚合在一块,在GROUP_CONCAT()里面嵌套一个DISTINCT()去重函数,达到去重得效果。
SELECT a.id
, GROUP_CONCAT(DISTINCT(substring_index(substring_index(需要拆分的字符串, 需要拆分的符号, b.help_topic_id + 1), 需要拆分符号, - 1))) AS name
FROM 表名 a
INNER JOIN mysql.help_topic b
ON b.help_topic_id < (length(需要拆分的字符串) - length(REPLACE(需要拆分的字符串, 需要拆分符号, '')) + 1)
GROUP BY a.id
效果图如下:
所用到函数:
SUBSTRING_INDEX (str, delim, count)
str: 需要分割的字符串
delim: 分割字符串的符号或字符
count: 分割(输入正整数表示获得从左到右的第几个关键字的左边内容,负整数为从右到左的右面内容)
GROUP_CONCAT([DISTINCT] column1 [ORDER BY column2 ASC\DESC] [SEPARATOR seq]);
是将分组中括号里对应的字符串进行连接.如果分组中括号里的参数有多行,那么就会将这多行的字符串连接,每个字符串之间会有特定的符号进行分隔。
column1: 将分组中column1这一列对应的多行的值按照
column2: 升序或者降序进行连接
seq:分隔符
# 如果没有指定SEPARATOR的话,默认以 ','分隔
distinct(查询字段)
distinct(查询字段),必须放在要查询字段的开头,即放在第一个参数;
只能在SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 中使用;
DISTINCT 表示对后面的所有参数的拼接取 不重复的记录,即查出的参数拼接每行记录都是唯一的
不能与all同时使用,默认情况下,查询时返回的就是所有的结果
的所有参数的拼接取 不重复的记录,即查出的参数拼接每行记录都是唯一的
不能与all同时使用,默认情况下,查询时返回的就是所有的结果