Я хочу вытащить дубликаты записей в базе данных MySQL. Это можно сделать с помощью:
SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1
Что приводит к:
100 MAIN ST 2
Я хотел бы вытащить его так, чтобы он показывал каждую строку, которая является дубликатом. Что-то вроде:
JIM JONES 100 MAIN ST
JOHN SMITH 100 MAIN ST
Есть мысли о том, как это можно сделать? Я стараюсь не делать первый, а затем искать дубликаты со вторым запросом в коде.
mysql
duplicates
Крис Бартоу
источник
источник
источник
->having(DB::raw('count(*)'), '>', 2)
к запросу. Большое спасибо!>=2
? Просто используйтеHAVING COUNT(*) > 1
Почему бы просто не присоединиться к столу с самим собой?
DISTINCT необходим, если адрес может существовать более двух раз.
источник
WHERE a.id > b.id
отфильтровывать только более новые дубликаты, чтобы я могDELETE
напрямую влиять на результат. Переключите сравнение, чтобы получить список старых дубликатов.Я попробовал лучший ответ, выбранный для этого вопроса, но это несколько смутило меня. Я действительно нуждался в этом только на одном поле из моей таблицы. Следующий пример по этой ссылке сработал очень хорошо для меня:
источник
Это тот же запрос, который вы просили, и он на 200% работает и легко. Наслаждаться!!!
источник
Разве это не проще?
?
источник
Найти повторяющихся пользователей по адресу электронной почты с этим запросом ...
источник
мы можем найти дубликаты, зависит также от более чем одного поля. Для этих случаев вы можете использовать ниже формат.
источник
Поиск повторяющихся адресов гораздо сложнее, чем кажется, особенно если вам требуется точность. В этом случае недостаточно запроса MySQL ...
Я работаю на SmartyStreets , где мы занимаемся валидацией, дедупликацией и другими вещами, и я видел много разных проблем с похожими проблемами.
Существует несколько сторонних сервисов, которые помечают дубликаты в списке для вас. Выполнение этого только с подзапросом MySQL не будет учитывать различия в форматах и стандартах адресов. USPS (для адреса в США) имеет определенные руководящие принципы, чтобы сделать эти стандарты, но только несколько поставщиков сертифицированы для выполнения таких операций.
Поэтому я бы порекомендовал вам лучший ответ - например, экспортировать таблицу в CSV-файл и отправить ее в работающий обработчик списков. Одним из таких инструментов является SmartyStreets Bulk Address Valid Tool, который сделает это за вас от нескольких секунд до нескольких минут автоматически. Он будет отмечать повторяющиеся строки с новым полем с именем «Duplicate» и значением
Y
в нем.источник
Другое решение - использовать псевдонимы таблиц, например:
Все, что вы действительно делаете в этом случае, - это извлечение исходной таблицы списков , создание из нее двух таблиц p- retend - p 1 и p 2 , а затем выполнение соединения со столбцом адреса (строка 3). Четвертая строка гарантирует, что одна и та же запись не будет отображаться несколько раз в наборе результатов («дубликаты дубликатов»).
источник
Не будет очень эффективным, но оно должно работать:
источник
Это позволит выбрать дубликаты за один проход таблицы, без подзапросов.
Этот запрос фактически эмулирует
ROW_NUMBER()
присутствующиеOracle
иSQL Server
Смотрите статью в моем блоге для деталей:
MySQL
.источник
FROM (SELECT ...) aoo
это подзапрос :-PЭто также покажет вам, сколько дубликатов есть, и упорядочит результаты без объединений.
источник
источник
SELECT users.name, users.uid, users.mail, from_unixtime(created) FROM users INNER JOIN ( SELECT mail FROM users GROUP BY mail HAVING count(mail) > 1 ) dup ON users.mail = dup.mail ORDER BY users.mail, users.created;
Для вашего стола это было бы что-то вроде
Этот запрос даст вам все отдельные записи адресов в таблице списка ... Я не уверен, как это будет работать, если у вас есть какие-либо значения первичного ключа для имени и т. Д.
источник
Самая быстрая процедура удаления дубликатов:
источник
Лично этот запрос решил мою проблему:
Этот скрипт показывает все идентификаторы абонента, которые существуют более одного раза, в таблице и количество найденных дубликатов.
Это столбцы таблицы:
Надеюсь, это будет полезно и для вас!
источник
Замените город своей таблицей. Замените имя на имя вашего поля
источник
источник
источник
Чтобы быстро увидеть повторяющиеся строки, вы можете выполнить один простой запрос
Здесь я опрашиваю таблицу и перечисляю все повторяющиеся строки с одинаковыми user_id, market_place и sku:
Чтобы удалить дублирующую строку, вы должны решить, какую строку вы хотите удалить. Например, с более низким идентификатором (обычно старше) или, возможно, с другой информацией о дате. В моем случае я просто хочу удалить нижний идентификатор, поскольку более новый идентификатор является самой последней информацией.
Сначала проверьте, удаляются ли нужные записи. Здесь я выбираю запись среди дубликатов, которые будут удалены (по уникальному идентификатору).
Затем я запускаю запрос на удаление, чтобы удалить обманщиков:
Резервное копирование, Двойная проверка, проверка, проверка резервной копии, затем выполнить.
источник
select address from list where address = any (select address from (select address, count(id) cnt from list group by address having cnt > 1 ) as t1) order by address
внутренний подзапрос возвращает строки с дублирующимся адресом, затем внешний подзапрос возвращает адресный столбец для адреса с дубликатами. внешний подзапрос должен возвращать только один столбец, поскольку он используется в качестве операнда для оператора '= any'
источник
Ответ Powerlord действительно лучший, и я бы рекомендовал еще одно изменение: используйте LIMIT, чтобы убедиться, что db не будет перегружен:
Хорошей привычкой является использование LIMIT, если нет WHERE и при создании соединений. Начните с малого значения, проверьте, насколько тяжелым является запрос, а затем увеличьте лимит.
источник