0

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

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

以下查询似乎可以工作,但每次我尝试使用它时都会使 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

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

4

3 回答 3

0

我认为INorexists语句是很重的表现。

假设您的表有一个名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 不为空。如果 pc2_id 为空,则不重复。否则,如果记录重复超过2次,它会出现在你的结果中超过1次,是不是有问题?

于 2013-06-05T03:33:50.200 回答
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 的记录。

于 2013-06-05T17:50:50.490 回答
0

您的查询在逻辑上是正确的。in然而,MySQL 在优化子查询方面存在一些问题。试试这个版本:

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
             )
于 2013-06-04T23:54:39.193 回答