2013-06-04 2 views
0

모든 중복을 가져 와서 열 이름으로 그룹화하는 쿼리를 찾았으나 각 레코드를 열 이름별로 그룹화 한 고유 한 행으로 표시해야합니다.동일한 열 데이터의 중복 찾기

동일한 디자인 열이있는 여러 레코드가 업로드되었으며 각 행을 비교할 수 있어야 어떤 레코드가 활성인지 여부를 확인할 수 있어야합니다.

다음 쿼리는 그것이 작동하는 것처럼 보이지만, MySQL의에게 I 시도하고 그것을 사용할 때마다 충돌 :

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

내가 중복 될 수있다 단지 기록을 보여주기 위해 모든 레코드를 필요로합니다. 그 이유는 나머지 열을 비교할 수 있어야하므로 어떤 중복이 필요한지 알 수 있습니다.

+0

"* mysql을 매번 충돌 *"하는 것이 무엇을 의미합니까? MySQL이 segfault합니까? 그렇다면 안정 (GA) 버전을 사용하고 있는지 확인하고 필요한 경우 업그레이드하고 문제가 지속되면 버그 보고서를 제출해야합니다. – eggyal

+0

500 내부 오류 – dcolumbus

+0

이것은 MySQL 오류가 아닌 httpd 오류처럼 들립니다. – eggyal

답변

0

쿼리가 논리적으로 정확합니다. 그러나 MySQL에는 서브 쿼리를 사용하여 in을 최적화하는 데 몇 가지 문제가 있습니다. .

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 
      ) 
: 그것은 여전히 ​​작동하지 않으면, 당신은 pcid이 테이블의 각 행의 고유 ID입니다 그런 다음이 시도 2009_product_catalog(sku, pcid) (에 인덱스를 확인

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; 

:이 버전을 사용해보십시오

+0

500 내부 오류. 당신의 예는 약간 혼란스럽고 ... 그것은 생산되지 않습니다. – dcolumbus

0

은 내가 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 회 이상 표시됩니다. 문제가 있습니까?

+0

이것은 실제로 나에게 결과를 제공하는 유일한 쿼리입니다 ... 그러나 중복 될 수있는 레코드뿐만 아니라 모든 레코드가 필요합니다. 그 이유는 나머지 열을 비교할 수 있어야하므로 어떤 중복이 필요한지 알 수 있습니다. – dcolumbus

+0

필요에 따라 쿼리를 업데이트했습니다. – Tarzan

+0

500 내부 오류. – dcolumbus

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가 중복 된 레코드가 있습니다.

+0

이것은 점점 가까워지고 있습니다 ...하지만 내가 찾고있는 것은 각 행이 (이 경우)'sku '에 의해 결과로 정렬된다는 것입니다 ... 각 행을 볼 수 있어야 필자와 비교할 수 있어야합니다. 그 (것)들을 제거하고 어떤 사본이 사용되지 않는지 제거하십시오. 말이 돼? (ID) 4 (SKU) 1,234 (ID) 5 (SKU) 1,234 (ID) 7 (SKU) 4422 (ID) 9 (SKU) 4422 – dcolumbus

+0

것만으로 주문하는 절에 추가 주문 skuch ORDER BY t1.sku (4 1234), (5 1234), (7 4422), (9 4422)와 같은 각 행을 선택해야합니다. –