2012-07-27 13 views
19

To pytanie jest dość prosta I z jakiegoś powodu nie mogę uzyskać prawidłowe wyniki, aby wyświetlić tylko zduplikowane rekordywybrać i tylko zduplikowane rekordy w MySQL

Table : Paypal_ipn_orders 
id        payer_email 
1        [email protected] 
2        [email protected] 
3        [email protected] 
4        [email protected] 
5        [email protected] 

SELECT id, COUNT(payer_email) `tot` 
FROM paypal_ipn_orders 
GROUP BY payer_email 
HAVING `tot` >1 

wyjście próbki

id  tot 
1   2 
4   2 

oczekiwany wynik

id  payer_email 
1  [email protected] 
3  [email protected] 
4  [email protected] 
5  [email protected] 

Jak mogę to zrobić?

Odpowiedz

39
SELECT id, payer_email 
FROM paypal_ipn_orders 
WHERE payer_email IN (
    SELECT payer_email 
    FROM paypal_ipn_orders 
    GROUP BY payer_email 
    HAVING COUNT(id) > 1 
) 

sqlfiddle

+0

który zwraca tę nieznaną tabelę status: TABLE_TYPE nieznany status tabeli: TABLE_TYPE' oraz 'Wyświetlanie wierszy 0 - -1 (0 całkowity, Query zajęło 39.6457 s)' – user1542036

+0

@ user1542036 To nie ma nic wspólnego z tym zapytaniem. To jest poprawne (sprawdź w sqlfidddle). Wyszukaj w Google swój błąd. –

+0

jedyne, co mi się wydaje to problem z konkretną wersją phpmyadmin? Używam wersji 3.4.1, więc uaktualnienie do najnowszej wersji powinno naprawić? – user1542036

-2

Spróbuj zapytanie:

SELECT id, COUNT(payer_email) `tot` 
FROM paypal_ipn_orders 
GROUP BY id 
HAVING `tot` >1 

Czy to pomoże?

0
SELECT id, payer_email FROM paypal_ipn_orders 
WHERE payer_email IN (
    SELECT payer_email FROM papypal_ipn_orders GROUP BY payer_email HAVING COUNT(*) > 1) 
+1

ten zwraca również samething jak inni – user1542036

8

IN był zbyt powolny w mojej sytuacji (180 sekund)

Więc użyłem JOIN zamiast (0,3 sek)

SELECT id, payer_email 
FROM paypal_ipn_orders i 
INNER JOIN (
SELECT payer_email 
    FROM paypal_ipn_orders 
    GROUP BY payer_email 
    HAVING COUNT(id) > 1 
) j ON i.payer_email=j.payer_email 
+0

Zastosowanie SELECT i.id, i.payer_email OD paypal_ipn_orders i inaczej pokaże niejednoznaczne błąd –

2

Get lista wszystkich zduplikowanych wierszy z tabeli:

Select * from TABLE1 where PRIMARY_KEY_COLUMN NOT IN (SELECT PRIMARY_KEY_COLUMN 
FROM TABLE1 
GROUP BY DUP_COLUMN_NAME having (count(*) >= 1)) 
+1

Zdecydowanie najszybszy, ale trzeba usunąć „=” od liczby (*)> = 1, ponieważ zajmie się identyfikatorami, które istnieją tylko raz. – Incognito

1

Hi powyżej odpowiedzi nie będzie działać, jeśli chcę, aby wybrać jeden lub więcej wartości kolumny, które nie są takie same lub mogą być takie same dla obu rzędów danych

Ex. Chcę również wybrać nazwę użytkownika, datę urodzenia. Ale w bazie danych nazwa użytkownika nie jest duplikatem, ale data urodzenia będzie duplikatem, wtedy to rozwiązanie nie będzie działać.

Dla tego zastosowania to rozwiązanie trzeba wziąć własny dołączyć na tej samej tabeli/

SELECT 
    distinct(p1.id), p1.payer_email , p1.username, p1.birth_date 

FROM 
    paypal_ipn_orders AS p1 

INNER JOIN paypal_ipn_orders AS p2 

ON p1.payer_email=p2.payer_email 

WHERE 

p1.birth_date=p2.birth_date 

Powyższe zapytanie zwróci wszystkie rekordy zawierające tę samą email_id i samą datę urodzenia

0

To działa najszybciej dla mnie

SELECT 
    primary_key 
FROM 
    table_name 
WHERE 
    primary_key NOT IN (
     SELECT 
      primary_key 
     FROM 
      table_name 
     GROUP BY 
      column_name 
     HAVING 
      COUNT(*) = 1 
    ); 
0

Myślę, że ten sposób jest prostszy. Dane wyjściowe wyświetlają identyfikator i adres e-mail płatnika, w których adres e-mail płatnika znajduje się w więcej niż jednym rekordzie w tej tabeli. Wyniki są sortowane według identyfikatora.

SELECT id, payer_email 
    FROM paypal_ipn_orders 
    WHERE COUNT(payer_email)>1 
    SORT BY id; 
1

oto prosty przykład:

select <duplicate_column_name> from <table_name> group by <duplicate_column_name> having count(*)>=2 

To będzie zdecydowanie działać.:)

0

podobne do this answer, chociaż użyłem tabeli tymczasowej zamiast:

CREATE TEMPORARY TABLE duplicates (
    SELECT payer_email 
    FROM paypal_ipn_orders 
    GROUP BY payer_email 
    HAVING COUNT(id) > 1 
); 
SELECT id, payer_email 
FROM paypal_ipn_orders AS p 
INNER JOIN duplicates AS d ON d.payer_email=p.payer_email; 
1

użyć tego kodu

SELECT * 
    FROM paypal_ipn_orders 
    GROUP BY payer_email 
    HAVING COUNT(payer_email) >1 
0

SELECT * FROM t1 table dołączyć table t2 where (t1.name = t2 .name) & & (t1.id! = t2.id)

+1

Czy możesz wyjaśnić swoje rozwiązanie problemu? Możesz także użyć funkcji wcięcia kodu edytora, aby podświetlić SQL (cztery spacje). –

Powiązane problemy