2010-05-21 2 views
6

У меня есть таблица, как этотПолучить список повторяющихся строк в MySql

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

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

ответ

13

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

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» и «Витязь» являются фамилия, а не имя:: р.

+2

Мне просто нужно было добавить select distinct (запрос возвращался в 2 раза по той же строке). спасибо за помощь – user347033

11

Общее решение вашей проблемы является запрос вида

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

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


Если вы действительно хотите, идентификатор, попробовать что-то вроде этого:

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 

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

+0

На самом деле это не будет возвращать все строки, оно просто найдет повторяющиеся строки. – jle

+0

Это путь к дорогому, вы можете решить его с помощью простого соединения (см. Мой ответ: p). – wimvds

0
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 

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

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

+0

Хм ... Я понимаю, что вы сейчас имеете в виду. Но я уверен, что ваш запрос неверен. Вы не можете вернуть 'id', если вы не используете его для' group by'. – ewernli

+0

Это соединение не работает - в запросе t2 нет столбца 'id'. –

+0

Это просто вопиюще неправильно. Группа по сути исключает любые дубликаты, которые у вас есть, если вы используете MySQL, поскольку вы только группируете на nachname и vorname, поэтому он будет возвращать 1 строку с 1 идентификатором, а не все отличительные как вы, вероятно, ожидали (просто попробуйте, вы увидите). О, и любые другие РСУБД будут жаловаться на вашу группу (что является imho единственным правильным способом, я ненавижу MySQL, пытаясь угадать, чего вы хотите, и выполнять эти нестандартные запросы, а не бросать ошибку). – wimvds

2

Вы можете сделать это с автообъединением:

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 необходимо избегать иды соответствия против себя. (Если вы хотите получить только одну строку из каждого набора дубликатов, вы можете использовать t1.id<t2.id).

+0

Нет, этот будет возвращать только 1 строку с двумя соответствующими записями в ней, а не 2 строки, которые она должна вернуть ... – wimvds

+0

@wimvds true, если вы хотите, чтобы все повторяющиеся строки (вместо 1 строки каждого дубликата набора, вы должны использовать <>) –

Смежные вопросы