Поиск дубликатов MySQL
Сборник запросов для поиска, изменения и удаления дублей в таблице MySQL по одному и нескольким полям. В примерах все запросы будут применятся к следующий таблице:

Поиск дубликатов
Подсчет дублей
Запрос подсчитает количество всех записей с одинаковыми значениями в поле `col1` .
SELECT `col1`, COUNT(`col1`) AS `count` FROM `table` GROUP BY `col1` HAVING `count` > 1

Подсчет дубликатов по нескольким полям:
SELECT `col1`, `col2`, COUNT(*) AS `count` FROM `table` GROUP BY `col1`,`col2` HAVING `count` > 1

Все записи с одинаковыми значениями
Запрос найдет все записи с одинаковыми значениями в `col1` .
SELECT * FROM `table` WHERE `col1` IN (SELECT `col1` FROM `table` GROUP BY `col1` HAVING COUNT(*) > 1) ORDER BY `col1`

Для одинаковых значений в `col1` и `col2` :
SELECT * FROM `table` WHERE `col1` IN (SELECT `col1` FROM `table` GROUP BY `col1` HAVING COUNT(*) > 1) AND `col2` IN (SELECT `col2` FROM `table` GROUP BY `col2` HAVING COUNT(*) > 1) ORDER BY `col1`
Получить только дубликаты
Запрос получит только дубликаты, в результат не попадают записи с самым ранним `id` .
SELECT `table`.* FROM `table` LEFT OUTER JOIN (SELECT MIN(`id`) AS `id`, `col1` FROM `table` GROUP BY `col1`) AS `tmp` ON `table`.`id` = `tmp`.`id` WHERE `tmp`.`id` IS NULL

Для нескольких полей:
SELECT `table`.* FROM `table` LEFT OUTER JOIN (SELECT MIN(`id`) AS `id`, `col1`, `col2` FROM `table` GROUP BY `col1`, `col2`) AS `tmp` ON `a`.`id` = `tmp`.`id` WHERE `tmp`.`id` IS NULL
Уникализация записей
Запрос сделает уникальные названия только у дублей, дописав `id` в конец `col1` .
UPDATE `table` LEFT OUTER JOIN (SELECT MIN(`id`) AS `id`, `col1` FROM `table` GROUP BY `col1`) AS `tmp` ON `table`.`id` = `tmp`.`id` SET `table`.`col1` = CONCAT(`table`.`col1`, '-', `table`.`id`) WHERE `tmp`.`id` IS NULL

По нескольким полям:
UPDATE `table` LEFT OUTER JOIN (SELECT MIN(`id`) AS `id`, `col1`, `col2` FROM `table` GROUP BY `col1`, `col2`) AS `tmp` ON `table`.`id` = `tmp`.`id` SET `table`.`col1` = CONCAT(`table`.`col1`, '-', `table`.`id`) WHERE `tmp`.`id` IS NULL
Удаление дубликатов
Удаление дублирующихся записей, останутся только уникальные.
DELETE `table` FROM `table` LEFT OUTER JOIN (SELECT MIN(`id`) AS `id`, `col1` FROM `table` GROUP BY `col1`) AS `tmp` ON `table`.`id` = `tmp`.`id` WHERE `tmp`.`id` IS NULL
По нескольким полям:
DELETE `table` FROM `table` LEFT OUTER JOIN (SELECT MIN(`id`) AS `id`, `col1`, `col2` FROM `table` GROUP BY `col1`, `col2`) AS `tmp` ON `table`.`id` = `tmp`.`id` WHERE `tmp`.`id` IS NULL
Как в sql посчитать количество повторяющихся значений
Можно попробовать использовать функцию COUNT() в сочетании с оператором GROUP BY .
Предположим, у нас есть таблица «orders» с колонками «customer_name» и «order_date» , и мы хотим посчитать, сколько заказов было сделано каждым клиентом. Мы можем написать следующий SQL-запрос:
Этот запрос выберет все уникальные значения из колонки «customer_name» в таблице «orders» и подсчитает количество строк, связанных с каждым уникальным значением. Результатом запроса будет таблица со столбцами «customer_name» и «order_count» , в которой каждая строка будет показывать клиента и количество его заказов.
Поиск дубликата записей в таблице SQL

Есть таблица с несколькими полями. Есть список id, к которым нужно найти дубликаты по 3 полям (поле 1, поле 2, поле 3). Например, у меня есть id 1 — соответственно запрос должен вернуть id 5 и id 10 (совпадают первые 3 поля);для id 3 вернет id 7 (также совпадают 3 поля), для остальных id ничего не вернет (нет совпадений по 3 полям). Не могу составить запрос, который вывод бы только дубликаты (или исходная строка + дубликат) на основе id, прошу помочь. Все дубликаты в таблице выводить умею, количество считаю тоже, а вот дубликаты к конкретным записям не могу найти. Естественно, «боевая» таблица в разы больше 🙂 Нужно понять принцип.
Отслеживать
51.6k 201 201 золотой знак 63 63 серебряных знака 245 245 бронзовых знаков
Исключение дубликатов
Иногда в таблицах встречаются дубликаты, как например имена сотрудников. Для исключения повторяющихся строк, нужно после ключевого слова SELECT написать DISTINCT .
Чтобы получить список уникальных имен сотрудников, необходимо выполнить запрос:
SELECT DISTINCT first_name FROM employee
| first_name |
|---|
| Анна |
| Лука |
| Ольга |
| . |