2010-05-21 18 views
6

Mam tabeli jak tolistę zduplikowanych wierszy Pobierz w MySQL

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

Potrzebuję kwerendę, która zwróci wszystkie pola (select *) z zapisów, które mają taką samą Nachname i Vorname (w tym sprawa, zapisy 1 i 2). Czy ktoś może mi w tym pomóc? Dzięki

Odpowiedz

13

Poniższe zapytanie daje listę duplikatów:

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 Dane, które pisał wydaje się być źle „Kowalski” i „Rycerz” to lastname, a nie imię: p.

+2

Po prostu potrzebowałem dodać select distinct (zapytanie powracało 2 razy w tym samym wierszu). Dziękuję za pomoc – user347033

11

Ogólne rozwiązanie problemu to zapytanie z formularza

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

ten powróci jeden wiersz dla każdego zestawu duplikatu wiersza w tabeli. Ostatnia kolumna tego wyniku to liczba duplikatów dla poszczególnych wartości.


Jeśli naprawdę chcesz identyfikator, spróbuj coś takiego:

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 

nie testowałem go jednak

+0

W rzeczywistości nie zwróci wszystkich wierszy, a jedynie znajdzie duplikaty wierszy. – jle

+0

To droga do drogich, można to rozwiązać za pomocą prostego łączenia (patrz moja odpowiedź: 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 

ten powinien zwrócić wszystkie kolumny z tabeli, gdzie tam jest duplikat nachname i vorname. Zalecam zmianę * na dokładne kolumny, których potrzebujesz.

Edytuj: Dodałem max (identyfikator), aby grupa nie stanowiła problemu. Moje zapytanie nie jest tak eleganckie, jak bym chciał. Prawdopodobnie jest to łatwiejszy sposób.

+0

Hmm ... Rozumiem, co masz teraz na myśli. Ale jestem pewien, że twoje zapytanie jest błędne. Nie możesz zwrócić 'id', jeśli nie używasz go do' group by'. – ewernli

+0

To sprzężenie nie działa - nie ma kolumny "id" w zapytaniu t2. –

+0

To jest rażąco błędne ... Grupa w rzeczywistości wyeliminuje wszelkie duplikaty, które masz, jeśli używasz MySQL, ponieważ skupiasz się tylko na nachname i vorname, więc zwróci 1 wiersz z 1 identyfikatorem, zamiast wszystkich charakterystycznych. wiersze, jak prawdopodobnie się spodziewałeś (po prostu spróbuj, zobaczysz). Aha, i każdy inny RDBMS mógłby narzekać na twoją grupę przez (która jest imho jedyną poprawną drogą, nienawidzę MySQL próbując odgadnąć, co chcesz i wykonać te błędne zapytania, zamiast rzucać błąd). – wimvds

2

Można to zrobić z samosprzężenie:

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 jest konieczne w celu uniknięcia identyfikatorów pasujących przed siebie. (Jeśli chcesz mieć tylko jeden wiersz z każdego zestawu duplikatów, możesz użyć t1.id<t2.id).

+0

Nie, ten zwróci tylko 1 wiersz z 2 pasującymi rekordami, a nie 2 wiersze, które powinien powrócić ... – wimvds

+0

@wimvds prawda, jeśli chcesz wszystkie duplikaty wierszy (zamiast 1 wiersza każdego zestawu duplikatów, powinieneś użyć <>) –

Powiązane problemy