36

この質問は非常に単純です。何らかの理由で、重複するレコードのみを表示するための適切な結果を取得できません。

Table   : Paypal_ipn_orders
id                              payer_email
1                               susan@gmail.com
2                               ryan@gmail.com   
3                               susan@gmail.com
4                               steve@gmail.com
5                               steve@gmail.com

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        susan@gmail.com
3        susan@gmail.com
4        steve@gmail.com
5        steve@gmail.com

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

4

12 に答える 12

74
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

于 2012-07-27T19:56:04.330 に答える
15

私の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
于 2014-01-28T14:23:04.247 に答える
7

これが簡単な例です:

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

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

于 2015-12-17T10:38:33.210 に答える
2

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

Select * from TABLE1 where PRIMARY_KEY_COLUMN NOT IN ( SELECT PRIMARY_KEY_COLUMN
FROM TABLE1 
GROUP BY DUP_COLUMN_NAME having (count(*) >= 1))
于 2014-03-03T09:36:03.960 に答える
1

こんにちは上記の答えは、同じではない、または両方の行データで同じである可能性がある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と同じ誕生日を持つすべてのレコードを返します

于 2014-03-28T10:05:09.110 に答える
1

このコードを使用する

 SELECT *  
    FROM  paypal_ipn_orders 
    GROUP BY  payer_email  
    HAVING COUNT( payer_email) >1  
于 2016-04-27T11:46:37.700 に答える
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)
于 2012-07-27T19:58:09.150 に答える
0

これは私にとって最速で動作します

SELECT
    primary_key
FROM
    table_name
WHERE
    primary_key NOT IN (
        SELECT
            primary_key
        FROM
            table_name
        GROUP BY
            column_name
        HAVING
            COUNT(*) = 1
    );
于 2014-09-11T17:22:58.207 に答える
0

この回答と同様ですが、代わりに一時テーブルを使用しました。

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;
于 2016-01-11T17:42:35.210 に答える
0
SELECT * FROM `table` t1 join `table` t2 WHERE (t1.name=t2.name) && (t1.id!=t2.id)
于 2016-04-27T14:49:13.320 に答える
-1

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

    SELECT id, payer_email
    FROM paypal_ipn_orders
    WHERE COUNT( payer_email )>1
    SORT BY id;
于 2015-06-07T21:04:13.703 に答える
-2

このクエリを試してください:

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

それは役に立ちますか?

于 2012-07-27T19:53:02.877 に答える