2010-09-23 96 views
4

我有这个疑问显示重复的记录

SELECT id, timeOrdered, order_desc, firstname, lastname 
FROM `db`.`myTable` 
WHERE `myTable`.`customer_number` IN (100, 101, 102, 103, 104, 105) 

我试图找到其中的重复记录。如果timeOrdered,order_desc,firstname,lastname是相同的,那么它的重复。

会为
感谢

+0

[在MySQL中查找重复记录](http:// stackoverf low_questions/854128/find-duplicate-records-in-mysql) – 2010-09-23 20:31:47

回答

11

查询看什么什么样的价值观有重复:

SELECT t.order_desc, 
     t.firstname, 
     t.lastname 
    FROM db.mytable t 
    WHERE t.customer_number IN (100, 101, 102, 103, 104, 105) 
GROUP BY t.order_desc, t.firstname, t.lastname, t.timeordered 
    HAVING COUNT(*) > 1 

要查看与这些重复相关的整个记录​​:

SELECT x.* 
    FROM db.mytable x 
    WHERE EXISTS(SELECT NULL 
       FROM db.mytable t 
       WHERE t.customer_number IN (100, 101, 102, 103, 104, 105) 
        AND t.order_desc = x.order_desc 
        AND t.firstname = x.firstname 
        AND t.lastname = x.lastname 
        AND t.timeordered = x.timeordered 
      GROUP BY t.order_desc, t.firstname, t.lastname, t.timeordered 
       HAVING COUNT(*) > 1) 
WHERE x.customer_number IN (100, 101, 102, 103, 104, 105) 
+0

将timeOrdered列添加到比较 – SDReyes 2010-09-23 21:52:12

+0

@SDReyes:更正,thx。 – 2010-09-23 21:54:50

+0

删除最后一行中的where子句 – SDReyes 2010-09-23 21:56:12

3
SELECT DISTINCT 
    t1.id 
FROM 
    mytable t1 
    INNER JOIN mytable t2 ON 
     t1.timeordered = t2.timeordered AND 
     t1.order_desc = t2.order_desc AND 
     t1.firstname = t2.firstname AND 
     t1.lastname = t2.lastname AND 
     t1.id <> t2.id 
+1

如果例如有3行相等,则此查询将在结果集中生成重复项。一个独特的'可以'帮助。但是,此解决方案使用连接进行比较,大多数情况下速度更快。 +1 :) – SDReyes 2010-09-23 20:36:27

+0

@SDReyes:重复是JOINing的现实;处理2+匹配时EXISTS可以更快,而且不会出现重复结果。 'IN'通常不支持元组(但在MySQL上) – 2010-09-23 20:52:53

+1

@OMG Ponnies:是的。您的解决方案在SQL Server上使用〜100 000行进行79 ms测试。使用连接需要1872ms。真棒:O.恭喜OMG! :) – SDReyes 2010-09-23 21:55:48