在MySQL中查找重复值

Finding duplicate values in MySQL

我有一个带有varchar列的表,我想在这个列中查找所有具有重复值的记录。我能用什么查询来查找重复项?


GROUP BYSELECT的条款。让我们说你的名字是想找到duplicates柱:

1
SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;

这将返回结果的值在第一列的名称和数量,这说明如何多的时间值在第二。


1
2
3
4
SELECT varchar_col
FROM table
GROUP BY varchar_col
HAVING COUNT(*) > 1;


1
2
3
4
5
6
7
8
9
SELECT  *
FROM    mytable mto
WHERE   EXISTS
        (
        SELECT  1
        FROM    mytable mti
        WHERE   mti.varchar_column = mto.varchar_column
        LIMIT 1, 1
        )

这个查询返回完整的记录,不只是不同的varchar_column’s。

这不是COUNT(*)查询使用。如果有大量的duplicates,COUNT(*)是昂贵的,和你不需要整个COUNT(*),你只需要知道如果有两行具有相同的值。

有一个在线varchar_column指数将,当然,这大大加快查询。


建筑外levik’s)的入侵检测系统得到的回答,你可以重复的行,如果你的服务器支持的GROUP_CONCAT(这将返回它的逗号分隔列表的ID)。

1
SELECT GROUP_CONCAT(id), name, COUNT(*) c FROM documents GROUP BY name HAVING c > 1;


1
2
3
SELECT *
FROM `dps`
WHERE pid IN (SELECT pid FROM `dps` GROUP BY pid HAVING COUNT(pid)>1)


你的表是一assuming《tableabc和你想要的是一列列和主键到T1是关键。

1
2
3
4
SELECT a.Key, b.Key, a.Col
FROM TableABC a, TableABC b
WHERE a.Col = b.Col
AND a.Key <> b.Key

这种方法的优点是它使在上述答案的关键。


发现如何许多记录是在中柱duplicates名员工,是helpful下面的查询;

1
Select name from employee group by name having count(*)>1;

我没有看到任何连接的方法有很多,其中使用duplicates而言。

该方法使现有的结果是双重的。

1
2
3
4
5
SELECT t1.* FROM my_table as t1
LEFT JOIN my_table as t2
ON t1.name=t2.name and t1.id!=t2.id
WHERE t2.id IS NOT NULL
ORDER BY t1.name


最后,我将回答一些查询的GROUP BY,是结合在一组记录,_ &;连接。

1
2
3
SELECT GROUP_CONCAT(id), `magento_simple`, COUNT(*) c
FROM product_variant
GROUP BY `magento_simple` HAVING c > 1;

这提供了两个实例的ID(逗号分隔),需要有一barcode duplicates,以及如何。

相应的表和列的变化。


1
2
3
4
5
6
7
SELECT t.*,(select count(*) from city as tt
  where tt.name=t.name) as count
  FROM `city` as t
  where (
     select count(*) from city as tt
     where tt.name=t.name
  ) > 1 order by count desc

将你的城市与表。替换你的字段名称。


我看到上述的结果和查询将工作,如果你需要检查单细柱,这是重复的值。例如电子邮件。

如果你需要更多的检查与检查柱与想查询的结果组合的操作系统,这将工作精细。

1
2
3
4
5
6
7
SELECT COUNT(CONCAT(name,email)) AS tot,
       name,
       email
FROM users
GROUP BY CONCAT(name,email)
HAVING tot>1 (This query will SHOW the USER list which ARE greater THAN 1
              AND also COUNT)

以"maxyfc’s i需要进一步找到答案,这是返回的所有行的重复的值,所以我可以编辑他们在MySQL工作台:


以下是产品_将查找所有的ID使用一次以上。你只得到单_记录每个产品ID。

1
SELECT product_id FROM oc_product_reward GROUP BY product_id HAVING count( product_id ) >1

采取从代码:http://///find-duplicate-records-based-on-any.html 2014年12 chandreshrana.blogspot.in


1
2
3
4
5
6
SELECT
    t.*,
    (SELECT COUNT(*) FROM city AS tt WHERE tt.name=t.name) AS count
FROM `city` AS t
WHERE
    (SELECT count(*) FROM city AS tt WHERE tt.name=t.name) > 1 ORDER BY count DESC


1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE tbl_master
    (`id` int, `email` varchar(15));

INSERT INTO tbl_master
    (`id`, `email`) VALUES
    (1, '[email protected]'),
    (2, '[email protected]'),
    (3, '[email protected]'),
    (4, '[email protected]'),
    (5, '[email protected]');

QUERY : SELECT id, email FROM tbl_master
WHERE email IN (SELECT email FROM tbl_master GROUP BY email HAVING COUNT(id) > 1)

我宁愿使用窗函数(8.0 + MySQL)发现duplicates因为i能看到整个行。

1
2
3
4
5
6
7
8
9
WITH cte AS (
  SELECT *
    ,COUNT(*) OVER(PARTITION BY col_name) AS num_of_duplicates_group
    ,ROW_NUMBER() OVER(PARTITION BY col_name ORDER BY col_name2) AS pos_in_group
  FROM table
)
SELECT *
FROM cte
WHERE num_of_duplicates_group > 1;

小提琴的演示数据库


1
SELECT DISTINCT a.email FROM `users` a LEFT JOIN `users` b ON a.email = b.email WHERE a.id != b.id;


1
2
3
4
SELECT ColumnA, COUNT( * )
FROM Table
GROUP BY ColumnA
HAVING COUNT( * ) > 1


在删除重复的行与多个域的第一cancate他们,这是一个新的指定的键是唯一的不同的行,然后使用"GROUP BY列"命令来删除重复的和独特的重点:

1
2
3
Create TEMPORARY table tmp select concat(f1,f2) as cfs,t1.* from mytable as t1;
Create index x_tmp_cfs on tmp(cfs);
Create table unduptable select f1,f2,... from tmp group by cfs;


如果你想删除重复使用DISTINCT

不使用这个查询:

SELECT users.*,COUNT(user_ID) as user FROM users GROUP BY user_name HAVING user > 1;


一个很晚的贡献……它帮助任何人的情况下waaaaaay线……我有一个任务:找到匹配对交易(真的)帐户的两端转移到银行帐户中的应用程序,它是能够确定的"从"和"到",为每个交易帐户间转移,所以我们这端跟踪:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
    LEAST(primaryid, secondaryid) AS transactionid1,
    GREATEST(primaryid, secondaryid) AS transactionid2
FROM (
    SELECT table1.transactionid AS primaryid,
        table2.transactionid AS secondaryid
    FROM financial_transactions table1
    INNER JOIN financial_transactions table2
    ON table1.accountid = table2.accountid
    AND table1.transactionid <> table2.transactionid
    AND table1.transactiondate = table2.transactiondate
    AND table1.sourceref = table2.destinationref
    AND table1.amount = (0 - table2.amount)
) AS DuplicateResultsTable
GROUP BY transactionid1
ORDER BY transactionid1;

结果是,在DuplicateResultsTable提供含匹配行(即重复)的交易,但它也提供了相同的事务ID,第二个是反向的对赛球队,所以在外SELECT有第一组的交易ID,这是做通过对确保该LEASTGREATEST二是transactionid’s总是在相同的顺序的结果,这使得它的一个安全的GROUP第一,从而消除所有重复的比赛。然近百万的记录和通过确定在2岁以下的比赛只是12000 +秒。当然,transactionid是原发性的指数,这是真的。


1
Select column_name, column_name1,column_name2, count(1) as temp from table_name group by column_name having temp > 1

尝试使用这个查询:

1
SELECT name, COUNT(*) value_count FROM company_master GROUP BY name HAVING value_count > 1;