查找相同列数据的重复项

时间:2013-06-04 23:52:34

标签: php mysql sql

我找到了一个查询,它抓取所有重复项并按列名对它们进行分组,但是我需要在它自己的行上显示每条记录,按列名称分组...

我怀疑的是,已经上传了具有相同设计列的多个记录,我需要能够比较每一行,以便确定哪些是活动的。

以下查询似乎可以正常工作,但每次尝试使用它时都会崩溃mysql:

SELECT *
FROM 2009_product_catalog
WHERE sku IN (
    SELECT sku
    FROM 2009_product_catalog
    GROUP BY sku
    HAVING count(sku) > 1
    )
ORDER BY sku

我需要显示所有记录,而不仅仅是可能重复的记录。原因是,我需要能够比较其余的列,所以我可以知道需要哪些副本。

3 个答案:

答案 0 :(得分:0)

您的查询在逻辑上是正确的。但是,MySQL在使用子查询优化in时遇到了一些问题。试试这个版本:

SELECT pc.*
FROM 2009_product_catalog pc join
     (SELECT sku
      FROM 2009_product_catalog
      GROUP BY sku
      HAVING count(sku) > 1
     ) pcsum
     on pcsum.sku = pc.sku
ORDER BY sku;

如果仍然无效,请确保您在2009_product_catalog(sku, pcid)上有一个索引(其中pcid是表格中每行的唯一ID。然后尝试:

select pc.*
FROM 2009_product_catalog pc
where exists (select 1
              from 2009_product_catalog pc2
              where pc2.sku = pc.sku and pc2.pcid <> pc.pcid
             )

答案 1 :(得分:0)

我认为INexists声明表现非常糟糕。

假设您的表中有一个名为id的字段作为主键。请记住在id字段上创建索引。

sku

修改


SELECT pc.*
FROM 
    2009_product_catalog pc
        INNER JOIN 2009_product_catalog pc2 ON pc.sku = pc2.sku AND pc.id != pc2.id

此查询为您提供所有记录,每个重复记录的pc2_id都不为空。如果pc2_id为null,则不会重复。否则,如果记录重复超过2次,它会在你的结果中显示超过1次,是否有问题?

答案 2 :(得分:0)

SELECT * FROM 2009_product_catalog t1 INNER JOIN
( SELECT sku FROM 2009_product_catalog GROUP BY sku HAVING COUNT(sku) > 1 ) t2
ON t1.sku = t2.sku

这是您问题中发布的原始查询的替代。它使用连接而不是子查询,自然连接更快。

t1是原始表格。 t2仅包含那些重复的行。 结果(内部联接)将包含重复的sku记录。