繁体   English   中英

查找相同列数据的重复项

[英]Finding duplicates of the same column data

我找到了一个查询,该查询可捕获所有重复项并按列名将它们分组,但是我需要在其自己的行上显示每个记录,并按列名分组...

我怀疑的是,上载具有相同设计列的多个记录,并且我需要能够比较每一行,以便确定哪些行处于活动状态。

下面的查询似乎可以正常工作,但是每次尝试使用它时,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

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

您的查询在逻辑上是正确的。 但是,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
             )

我认为INexists语句的性能非常高。

假设您的表有一个名为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

编辑


SELECT pc.*, pc2.id as `pc2_id`
FROM 
    2009_product_catalog pc
        LEFT OUTER JOIN 2009_product_catalog pc2 ON pc.sku = pc2.sku AND pc.id != pc2.id

此查询为您提供所有记录,每个重复的记录的pc2_id不为null。 如果pc2_id为null,则不会重复。 否则,如果记录重复2次以上,它将在您的结果中出现1次以上,这有问题吗?

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记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM