web-dev-qa-db-ja.com

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

サンプル出力

id       tot
1         2
4         2

期待される出力

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

どうすればこれを実現できますか?

24
user1542036
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

54
lc.

INは私の状況では遅すぎました(180秒)

そこで、代わりにJOINを使用しました(0.3秒)

SELECT i.id, i.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
12
Timo Huovinen

以下に簡単な例を示します。

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

それは間違いなく動作します。 :)

2
Gaurav Gupta

テーブルからすべての重複行のリストを取得します。

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

このコードを使用

 SELECT *  
    FROM  Paypal_ipn_orders 
    GROUP BY  payer_email  
    HAVING COUNT( payer_email) >1  
1
M.Ganji

両方の行データで同じではない、または同じかもしれない1つ以上の列値を選択したい場合、上記の回答は機能しません

例ユーザー名、誕生日も選択したいです。しかし、データベースではユーザー名は重複していませんが、誕生日は重複しているため、このソリューションは機能しません。

このソリューションを使用するには、同じテーブルで自己結合する必要があります/

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

上記のクエリは、同じemail_idと同じ誕生日を持つすべてのレコードを返します

1
Sameer Kazi

これは私にとって最速です

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
Incognito
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)
0
Kermit

この回答 に似ていますが、代わりに一時テーブルを使用しました:

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;
0
jdenoc
SELECT * FROM `table` t1 join `table` t2 WHERE (t1.name=t2.name) && (t1.id!=t2.id)
0
user3237205

この方法の方が簡単だと思います。出力には、IDと支払人の電子メールが表示されます。支払人の電子メールは、このテーブルの複数のレコードにあります。結果はIDでソートされます。

    SELECT id, payer_email
    FROM Paypal_ipn_orders
    WHERE COUNT( payer_email )>1
    SORT BY id;
0
Filippos