我发现了一个查询,该查询获取所有重复项并按列名对它们进行分组,但我需要在其自己的行上显示每条记录,并按列名进行分组……
我怀疑的是,已经上传了具有相同设计列的多个记录,我需要能够比较每一行,以便确定哪些记录处于活动状态。
下面的查询似乎可以工作,但每次我尝试使用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我需要所有的记录来显示,而不仅仅是那些可能是重复的记录。原因是,我需要能够比较其余的列,这样我才能知道哪些重复项需要删除。
发布于 2013-06-05 07:54:39
您的查询在逻辑上是正确的。但是,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
)发布于 2013-06-05 11:33:50
我认为IN或exists语句的性能非常重。
假设您的表有一个名为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次以上,有问题吗?
发布于 2013-06-06 01:50:50
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的记录。
https://stackoverflow.com/questions/16929321
复制相似问题