Как найти / удалить дублированные записи в одной строке - PullRequest
1 голос
/ 23 января 2011

Можно сделать запрос, чтобы увидеть, есть ли дубликаты записей в той же строке?

Я пытался найти решение, но все, что я могу найти, - это обнаружить дублированные поля в столбцах, а не в строках.

пример, скажем, у меня есть таблица со строками и элементами:

| id | item1 | item2 | item3 | item4 | item5 | upvotes | downvotes |
--------------------------------------------------------------------
| 1  |  red  | blue  |  red  | black | white |   12    |    5      |

Итак, я хочу посмотреть, возможно ли сделать запрос, чтобы обнаружить поля с одинаковой записью (в данном случае красным) и удалить их, и / или как изменить структуру моей структуры, чтобы не допустить дублирования.

Спасибо.

1 Ответ

4 голосов
/ 23 января 2011

с редизайном:

Вы можете изменить макет примерно так:

| id | item |

При наличии (id, item) в качестве первичного ключа это запрещает иметь дважды одинаковые item для данного id.

Таким образом, данные будут выглядеть так:

| id | item |
| 1  | red  |
| 1  | blue |
...

Попытка вставить | 1 | red | снова приведет к ошибке.

Без перепроектирования:

Если вы не хотите изменять макет, этот запрос найдет строки, в которых одно из полей fieldX равно другому fieldX из той же строки:

SELECT t.id FROM (select 1) dummy
JOIN (SELECT id, item1 as item FROM table
      UNION SELECT id, item2 as item FROM table
      UNION SELECT id, item3 as item FROM table
      UNION SELECT id, item4 as item FROM table
      UNION SELECT id, item5 as item FROM table) t
GROUP BY t.id
HAVING count(*) < 5

(Предполагается, что у вас есть 5 из этих fieldX столбцов.)

Это фактически подсчитывает различные значения fieldX для каждого id. Если количество отличается от количества полей, то есть дубликат. Запрос возвращает идентификаторы строк, в которых есть дубликат.

После тестирования вы можете удалить строки с помощью

DELETE FROM table WHERE id IN ( <the previous query here> )
...