Получить список повторяющихся строк в MySql

У меня есть таблица вроде этого

ID     nachname     vorname
1       john         doe
2       john         doe
3       jim          doe
4       Michael     Knight

Мне нужен запрос, который вернет все поля (выберите *) из записей, которые имеют одно и то же имя и vorname (в этом случае записи 1 и 2). Кто-нибудь может мне с этим помочь? Благодаря

Ответ 1

Следующий запрос предоставит список дубликатов:

SELECT n1.* FROM table n1
inner join table n2 on n2.vorname=n1.vorname and n2.nachname=n1.nachname
where n1.id <> n2.id

BTW Данные, которые вы опубликовали, являются неправильными "Doe" и "Knight" - это имя, а не имя: p.

Ответ 2

Общее решение вашей проблемы - это запрос формы

SELECT col1, col2, count(*)
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1

Это вернет одну строку для каждого набора повторяющихся строк в таблице. Последним столбцом в этом результате является количество дубликатов для определенных значений.


Если вам действительно нужен ID, попробуйте что-то вроде этого:

SELECT id FROM 
t1, 
( SELECT col1, col2, count(*)
  FROM t1
  GROUP BY col1, col2
  HAVING count(*) > 1 ) as t2
WHERE t1.col1 = t2.col1 AND t1.col2 = t2.col2 

Не проверял, хотя

Ответ 3

Вы можете сделать это с помощью самоподключения:

select distinct t1.id from t as t1 inner join t as t2 
on t1.col1=t2.col1 and t1.col2=t2.col2 and t1.id<>t2.id

t1.id<>t2.id необходимо избегать сопоставления идентификаторов с самим собой. (Если вы хотите только 1 строку из каждого набора дубликатов, вы можете использовать t1.id<t2.id).

Ответ 4

select * from table AS t1 inner join
(select max(id) As id,nachname,vorname, count(*) 
from t1 group by nachname,vorname 
having count(*) >1) AS t2 on t1.id=t2.id

Это должно возвращать ВСЕ столбцы из таблицы, где есть дублированное имя и vorname. Я рекомендую изменить * на точные столбцы, которые вам нужны.

Изменить: я добавил max (id), чтобы группа не была проблемой. Мой запрос не такой элегантный, как хотелось бы. Вероятно, есть более простой способ сделать это.