【问题标题】:Find duplicate records in table by more than one criteria通过多个条件查找表中的重复记录
【发布时间】:2012-10-15 14:58:40
【问题描述】:
+-------------------------+
| SKU  |  UPC  |   NAME   | INVID
+-------------------------+
| 001  |  111  |   NAME1  |  1
| 001  |  null |   NAME2  |  2
| 0-1  |  111  |   NAME3  |  3
| -01  |  111  |   NAME4  |  4
| 002  |  222  |   NAME5  |  5
| 002  |  null |   NAME6  |  6
| 003  |  333  |   NAME7  |  7
+-------------------------+

我想通过两个条件在此表中查找重复记录。首先是SKU,其次是UPC。在这种情况下,重复记录是 [1,2,3,4] 和 [5,6]。 行 [1,2] 是重复的,因为 sku 编号匹配。行 [1,3,4] 是重复的,因为 UPC 编号匹配。 第一个重复组应如下所示:

GROUP1*

+-------------------------+
| 001  |  111  |   NAME1  |  1
| 001  |  null |   NAME2  |  2
| 0-1  |  111  |   NAME3  |  3
| -01  |  111  |   NAME4  |  4
+-------------------------+

第二个重复组应如下所示:

GROUP2*

+-------------------------+
| 002  |  222  |   NAME5  |  5
| 002  |  null |   NAME6  |  6
+-------------------------+

如何使用 mysql 查询找到这些组? 如果我发现重复记录,我会为表中的任何重复记录设置一个 grouID***。

我试过了,但没有显示所有重复项。

select sku, upc
from inv
WHERE sku is not null 
GROUP BY sku, upc HAVING count(sku)  > 1 OR count(upc)  > 1

这是 SQL 架构:

http://sqlfiddle.com/#!2/4d760/2

此查询返回空结果。

【问题讨论】:

  • 那个 sql fiddle 站点非常适合 SQL 问题,感谢您的介绍

标签: php mysql


【解决方案1】:

这是一个将重复条目显示为单个结果的查询:

select distinct i1.*
  from inv i1, inv i2
  WHERE i1.sku is not null AND 
    (i1.sku = i2.sku OR i1.upc = i2.upc) AND i1.idinv != i2.idinv
  ORDER BY idinv

这实现了将表与自身连接并寻找不同的匹配。

【讨论】:

    【解决方案2】:

    如果您有 2 个查询执行您想要的操作并返回相同的列,您可以使用 UNION 使它们显示为一个结果集。

    这可能包括重复-重复(出现在两个重复查询中的记录)

    编辑:或使用子查询

    select * from inv where upc in (select upc from inv group by upc having count(upc) > 1) 
    union
    select * from inv where sku in (select sku from inv group by sku having count(sku) > 1);
    

    (我现在必须回去工作,但希望这会让您走上解决问题的道路)

    【讨论】:

    • select sku, upc, count(sku) from inv WHERE sku is not null GROUP BY sku HAVING count(sku) > 1 UNION select sku, upc, count(upc) from inv WHERE sku null GROUP BY upc HAVING count(upc) > 1 这不能正确返回结果
    • 这不是完全匹配的(对不起,得走了)但它可能会有所帮助:select * from inv where upc in (select upc from inv group by upc having count(upc) > 1) union select * from inv where sku in (select sku from inv group by sku having count(sku) > 1);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2016-11-13
    • 2017-08-13
    • 2012-08-03
    相关资源
    最近更新 更多