SQL查找行重复项

时间:2015-04-23 18:53:33

标签: mysql sql

我有一个类似于:

的MySQL数据库
+----+---------+---------+------------------+....
| id | unique1 | unique2 |   genaric_data   |....
+----+---------+---------+------------------+....
| 0  |   100   |   1C7   | {data container} |....
+----+---------+---------+------------------+....
| 1  |   100   |   1C7   | {data container} |....
+----+---------+---------+------------------+....
| 2  |   100   |   1C8   | {data container} |....
+----+---------+---------+------------------+....
| 3  |   101   |   ---   | {data container} |....
+----+---------+---------+------------------+....
| 4  |   102   |   0     | {data container} |....
+----+---------+---------+------------------+....
| 5  |   103   |   1     | {data container} |....
.................................................

我需要一种方法来添加一个额外的列,该列给出了使用所有唯一字段的次数。然后我需要手动清理数据。

我想要一个返回的查询:

+----+---------+---------+------+------------------+....
| id | unique1 | unique2 | dupe |   genaric_data   |....
+----+---------+---------+------+------------------+....
| 0  |   100   |   1C7   |   2  | {data container} |....
+----+---------+---------+------+------------------+....
| 1  |   100   |   1C7   |   2  | {data container} |....
+----+---------+---------+------+------------------+....
| 2  |   100   |   1C8   |   1  | {data container} |....
+----+---------+---------+------+------------------+....
| 3  |   101   |   ---   |   1  | {data container} |....
+----+---------+---------+------+------------------+....
| 4  |   102   |   0     |   1  | {data container} |....
+----+---------+---------+------+------------------+....
| 5  |   103   |   1     |   1  | {data container} |....
.......................................................

这是我一段时间以来遇到的问题,目前我唯一的解决方案是将数据导出到Excel并使用它来查找重复项。

感谢。

编辑: 从我执行以来,可能的重复不是解决我的问题的方法:

SELECT *,count(*) FROM `database`
GROUP BY  `unique1`
HAVING count(*) > 1

在PhpMyAdmin上(所有我允许访问)它将具有相同unique1的任何内容合并为一行。

2 个答案:

答案 0 :(得分:3)

您的问题的解决方案是使用GROUP BY:

SELECT unique1, unique2, Count(*) As colCount FROM YourTable
GROUP BY unique1, unique2
HAVING Count(*) > 1

这将返回不止一次出现的unique1和unique2的所有组合。

在第二步中,您可以构建一个返回所有受影响行的查询。

SELECT YourTable.*, rstDuplicates.colCount 
FROM YourTable INNER JOIN (
  SELECT unique1, unique2, Count(*) As colCount FROM YourTable
  GROUP BY unique1, unique2
  HAVING Count(*) > 1
) As rstDuplicates ON YourTable.unique1 = rstDuplicates.unique1 And YourTable.unique2 = rstDuplicates.unique2

这将输出至少有一个重复的所有行。 colCount列显示了出现次数。

答案 1 :(得分:1)

如果要添加包含信息的字段,则相关子查询可能是最简单的方法:

select t.*,
       (select count(*)
        from table t2
        where t2.unique1 = t.unique1 and t2.unique2 = t.unique2
       ) as dupecnt
from table t;

有时,这是有效的(索引在unique1, unique2。有时,在from子句中进行聚合更有效:

select t.*, t2.dupecnt
from table t join
     (select unique1, unique2, count(*) as dupecnt
      from table t2
      group by unique1, unique2
     ) t2
     on t2.unique1 = t.unique1 and t2.unique2 = t.unique1