#mysql #duplicates
#mysql #дубликаты
Вопрос:
Мне нужно найти пользователей, которые были дважды вставлены в таблицу, но с заменой их имени и фамилии.
например, Боб Смит находится в базе данных как
firstname:Bob
lastname:Smith
amp;
firstname:Smith
lastname:Bob
Какой наилучший запрос для поиска этих пользователей?
На сервере работает mysql.
Ответ №1:
Select
*
FROM UserTable ut
JOIN UserTable ut2 on ut2.firstname = ut.lastname and ut2.lastname = ut.firstname
Комментарии:
1. Это хорошо работает с «ut.user_id, ut.firstname, ut.lastname, ut2.user_id, ut2.firstname, ut2.lastname» вместо * (немного уменьшенный набор данных), а также «порядок по ut2.firstname, ut2.lastname» в конце
2. @Ben вы не уточнили, какие данные вы хотели вернуть. Многие из вас хотят обновить свой вопрос.
3. Никакого давления, я просто добавляю некоторые отзывы
Ответ №2:
SELECT
firstname, lastname
FROM
(
SELECT firstname, lastname FROM MyTable -- WHERE firstname <> lastname
UNION ALL
SELECT lastname, firstname FROM MyTable -- WHERE firstname <> lastname
) foo
GROUP BY
firstname, lastname
HAVING
COUNT(*) > 1
Комментарии:
1. Мне нравится это решение. Хороший способ получить единый результат для каждого дубликата.
2. @john amp; gbn. Да, но в то же время мне нужно было бы знать, каковы идентификаторы этих записей
3. @Ben: возможно, вы захотите игнорировать строки, в которых имена совпадают. Я хотел прокомментировать это. Чтобы получить идентификаторы, самосоединение проще быть честным. Это можно сделать здесь, но это становится более сложным, чем самосоединение
4. @gbn. Хорошие усилия по удалению дубликатов, но мне нужны эти дубликаты, чтобы я мог получить идентификаторы
Ответ №3:
SELECT orig.firstname, orig.lastname
FROM yourtable AS orig
INNER JOIN yourtable AS dupes ON orig.firstname = dupe.lastname AND orig.lastname = dupe.firstname
В принципе, выполните самосоединение в таблице пользователей, но только в тех записях, где происходит дублирование fn / ln.