我正在寻找MySQL中完全重复的内容。有很多列,每行大约30-40列。似乎有一些重复的行,我想识别它们。有很多记录。
有没有办法让MySQL在每个列都相同的情况下返回所有重复的行,而无需列出并创建列出每列的查询?
答案 0 :(得分:1)
我想识别它们
你做不到。您只能通过唯一(或主要)键标识行。但如果你有,那就没有任何确切的重复。
但是 - 如果您真的不想列出所有列,则可以创建表的临时副本并添加AUTO_INCREMENT PRIMARY KEY。然后,NATURAL JOIN
,GROUP BY
和COUNT
的组合将返回重复的行:
drop table if exists my_duplicates;
create table my_duplicates (c1 int, c2 int, c3 int);
insert into my_duplicates(c1, c2, c3)values
(1,1,1),
(1,2,3),
(4,5,6),
(1,2,3);
drop temporary table if exists tmp;
create temporary table tmp as select * from my_duplicates;
alter table tmp add column row_number int auto_increment primary key;
select tmp.*
from tmp
natural join my_duplicates
group by tmp.row_number
having count(*) > 1
结果:
c1 | c2 | c3 | row_number
---|----|----|-----------
1 | 2 | 3 | 2
1 | 2 | 3 | 4
演示:http://rextester.com/COQA38406
如果您有主键列,则可以执行相反的操作:创建表的副本并将主键列放在副本表中。然后你有与上面相同的情况 - 你只需要在查询中切换表。
drop table if exists my_duplicates;
create table my_duplicates (id int auto_increment primary key, c1 int, c2 int, c3 int);
insert into my_duplicates(c1, c2, c3)values
(1,1,1),
(1,2,3),
(4,5,6),
(1,2,3);
drop temporary table if exists tmp;
create temporary table tmp as select * from my_duplicates;
alter table tmp drop column id;
select t.*
from my_duplicates t
natural join tmp
group by t.id
having count(*) > 1