按多个条件在表中查找重复记录

时间:2012-10-25 12:16:26

标签: php mysql

+-------------------------+
| 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

此查询返回空结果。

2 个答案:

答案 0 :(得分:0)

如果有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);

(我现在必须回去工作,但希望这会让你走上解决之道)

答案 1 :(得分:0)

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

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

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