2013-06-22 3 views
0

APOLOGIES: Я хотел сказать, что дубликаты должны находиться в одном столбце.MySQL Поиск дубликатов по нескольким столбцам

У меня есть следующий код:

SELECT m.* FROM ( 
    SELECT text 
    FROM mytable 
    GROUP BY text 
    HAVING COUNT(*) > 1) q 
JOIN mytable m 
ON m.text = q.text 

Это позволяет мне искать дубликаты на колонке text и работает отлично. Тем не менее, у меня есть таблица с:

q1a, q2a, q3a, q4a, q5a 

Что я хотел бы это для запроса проверки во всех колонках для дублей - если это возможно, и может кто-нибудь дать мне заостренную?

Спасибо,

H.

+0

Каким будет желаемый результат в матче по любому столбцу? Обе строки содержат совпадение без указания совпадений? –

+0

На столе есть идентификатор, я бы хотел, чтобы его вернули, если это возможно? В настоящее время он использует 'SELECT m. *'. –

ответ

1

Это может быть то, что вам нужно, оно даст вам текст, который дублируется, и по каким строкам и столбцам будет найдено совпадение;

SELECT GROUP_CONCAT(id) ids,q1a text,1 col 
FROM myTable GROUP BY text HAVING COUNT(*)>1 
UNION 
SELECT GROUP_CONCAT(id),q2a text,2 
FROM myTable GROUP BY text HAVING COUNT(*)>1 
UNION 
SELECT GROUP_CONCAT(id),q3a text,3 
FROM myTable GROUP BY text HAVING COUNT(*)>1 
UNION 
SELECT GROUP_CONCAT(id),q4a text,4 
FROM myTable GROUP BY text HAVING COUNT(*)>1 
UNION 
SELECT GROUP_CONCAT(id),q5a text,5 
FROM myTable GROUP BY text HAVING COUNT(*)>1 

An SQLfiddle to test with.

+0

Опять же, выглядит правильно, однако 'id' возвращается как' [BLOB - 7B] '!? Поле 'id' является' result_id', это имеет значение? –

+0

@Homer_J Хм, какой тип вашего идентификатора? :) –

+0

Apols - 'result_id' !!!! –

0

Если я undestand ваш вопрос правильно, вы можете использовать запрос, как это:

SELECT m.* 
FROM (
    SELECT txt FROM (
     SELECT q1a as txt FROM mytable 
     UNION ALL 
     SELECT q2a as txt FROM mytable 
     UNION ALL 
     SELECT q3a as txt FROM mytable 
     UNION ALL 
     SELECT q4a as txt FROM mytable 
     UNION ALL 
     SELECT q5a as txt FROM mytable) u 
    GROUP BY 
     txt 
    HAVING COUNT(*)>1) q 
    INNER JOIN mytable m 
    ON q.txt IN (m.q1a, m.q2a, m.q3a, m.q4a, m.q5a) 

Пожалуйста, смотрите скрипку here.

+0

Спасибо за ответ - однако это неверно. Дубликаты должны находиться в одной колонке. –

+0

@Homer_J Каков ваш ожидаемый результат? – fthiella

+0

@Homer_J Если они должны находиться в одном столбце, вы можете добавить это к своему вопросу. –