Поиск возможных дубликатов в базе данных

У меня есть база данных, в которой хранится несколько столбцов, и я пытаюсь создать эффективный SQL-запрос, который будет выводить все возможные дубликаты на основе выбранных столбцов (1 или более).

так, например, если бы у меня была база данных с «Именем», «Фамилией», «Телефоном», и я хотел бы иметь возможность находить дубликаты по имени и фамилии. Я хочу вывести только те, которые находятся в базе данных более двух раз, поэтому правильный вывод будет примерно таким:

John, Smith, 123456789
John, Smith, 987654321
John, Smith, 098546786
Peter, Donut, 234569087
Peter, Donut, 854567896

Я что-то искал, но единственная похожая вещь, которую я нашел, это что-то вроде

SELECT * FROM table GROUP BY name,surname HAVING COUNT(*)>1

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


person Blackie123    schedule 29.07.2011    source источник


Ответы (3)


Если телефон может быть одинаковым между дубликатами, просто используйте свой первичный ключ вместо его места при соединении.

SELECT DISTINCT t.name, t.surname, t.phone FROM table t 
LEFT OUTER JOIN table t2 ON t.name = t2.name AND t.surname = t2.surname AND t.phone <> t2.phone
WHERE t2.name IS NOT NULL
person Jodaka    schedule 29.07.2011
comment
это работает: $query = SELECT * FROM test t1, test t2 WHERE t1.number=t2.number AND t1.test=t2.test AND t1.id‹›t2.id; Благодарность! - person Blackie123; 29.07.2011

Будет ли что-то подобное работать?

SELECT *
FROM table t1
INNER JOIN
(
    SELECT name, surname
    FROM table
    GROUP BY name,surname
    HAVING COUNT(*)>1) t2
ON t1.name = t2.name AND t1.surname = t2.surname
person Brendan Long    schedule 29.07.2011
comment
либо я сделал ошибку, либо нет... то же самое, что и запрос, который я сделал - person Blackie123; 29.07.2011

person    schedule
comment
не уверен, что вы подразумеваете под T1.ID ‹ T1.ID, так как это не может быть правдой в любое время, но без него он записывает все дважды, поэтому что-то вроде John, Smith, 123456789 John, Smith, 123456789 John, Smith, 987654321 John, Смит, 987654321 Джон, Смит, 098546786 Джон, Смит, 098546786 - person Blackie123; 29.07.2011
comment
$query = SELECT * FROM test t1, test t2 WHERE t1.number=t2.number AND t1.test=t2.test AND t1.id‹›t2.id; › этот работает. Благодарность - person Blackie123; 29.07.2011