Delete duplicated tags MySQL

放肆的年华 提交于 2020-02-06 04:02:26

问题


I have duplicated tags on my MySQL DB such as below:

| id  | tags                                |
+- ---+-------------------------------------+
| 3   | x,yz,z,x,x                          |
| 5   | a,b,c d,a,b,c d, d                  |
+-----+-------------------------------------+

How can I execute a query that can remove the duplicated tags?

The result should be:

| id  | tags                                |
+- ---+-------------------------------------+
| 3   | x,yz,z                              |
| 5   | a,b,c d, d                          |
+-----+-------------------------------------+

回答1:


setup

create table overly_complex_tags
(
  id integer primary key not null,
  tags varchar(100) not null
);

insert into overly_complex_tags
( id, tags )
values
( 3   , 'x,yz,z,x,x'           ),
( 5   , 'a,b,c d,a,b,c d,d'    )
;

create view digits_v
as
SELECT 0 AS N 
UNION ALL 
SELECT 1 
UNION ALL 
SELECT 2 
UNION ALL 
SELECT 3 
UNION ALL 
SELECT 4 
UNION ALL 
SELECT 5 
UNION ALL 
SELECT 6 
UNION ALL 
SELECT 7 
UNION ALL 
SELECT 8 
UNION ALL 
SELECT 9
;

query delete duplicate tags

update overly_complex_tags t
inner join
(
select id, group_concat(tag) as new_tags
from
(
select distinct t.id, substring_index(substring_index(t.tags, ',', n.n), ',', -1) tag
from overly_complex_tags t 
cross join
(
  select a.N + b.N * 10 + 1 n
  from digits_v a
  cross join digits_v b
  order by n
) n
where n.n <= 1 + (length(t.tags) - length(replace(t.tags, ',', '')))
) cleaned_tags
group by id
) updated_tags
on t.id = updated_tags.id
set t.tags = updated_tags.new_tags
;

output

+----+-----------+
| id |   tags    |
+----+-----------+
|  3 | yz,z,x    |
|  5 | c d,a,d,b |
+----+-----------+

sqlfiddle


note

the complexity of above solution comes from not having a properly normalised structure.. note that the solution uses an intermediate normalised structure




回答2:


In Oracle we accomplish this as

Update table set col=(select distinct regexp_substr(col, '[^,]+', 1, level) col
          from table)

But for MySQL it not possible and only way is through PHP array as stated here. However Maria db have its solution as well. So use intermediate way.



来源:https://stackoverflow.com/questions/34378017/delete-duplicated-tags-mysql

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!