2013-06-04 4 views
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 

Мне нужно все записи, чтобы показать, а не только записи, которые могут быть дубликатами. Причина в том, что мне нужно иметь возможность сравнивать остальные столбцы, поэтому я могу знать, какие дубликаты должны уйти.

+0

Что это значит? * Сбой mysql каждый раз * "? Есть ли MySQL segfault? Если это так, вы должны проверить, используете ли вы стабильную (GA) версию, при необходимости обновите ее и напишите отчет об ошибке, если проблема не исчезнет. – eggyal

+0

500 Внутренняя ошибка – dcolumbus

+0

Это похоже на ошибку httpd, а не на MySQL. – eggyal

ответ

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 это уникальный идентификатор каждой строки в таблице, попробуйте следующее:.

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 
      ) 
+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 не является нулевым. Если pc2_id имеет значение NULL, он не дублируется. В противном случае, если запись дублируется более двух раз, она будет появляться в вашем результате более одного раза, это проблема?

+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, (ы) 1234 (ID) 5, (ы) 1234 (ID) 7, (ы) 4422 (ID) 9, (ы) 4422 – dcolumbus

+0

Просто добавьте заказ по п к порядку sku ЗАКАЗАТЬ t1.sku Он должен уже выбирать каждую строку, такую ​​как (4 1234), (5 1234), (7 4422), (9 4422) –