この質問は非常に簡単です。何らかの理由で、重複レコードのみを表示する適切な結果を得ることができません。
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]
どうすればこれを実現できますか?
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
)
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
以下に簡単な例を示します。
select <duplicate_column_name> from <table_name> group by <duplicate_column_name> having count(*)>=2
それは間違いなく動作します。 :)
テーブルからすべての重複行のリストを取得します。
Select * from TABLE1 where PRIMARY_KEY_COLUMN NOT IN ( SELECT PRIMARY_KEY_COLUMN
FROM TABLE1
GROUP BY DUP_COLUMN_NAME having (count(*) >= 1))
このコードを使用
SELECT *
FROM Paypal_ipn_orders
GROUP BY payer_email
HAVING COUNT( payer_email) >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と同じ誕生日を持つすべてのレコードを返します
これは私にとって最速です
SELECT
primary_key
FROM
table_name
WHERE
primary_key NOT IN (
SELECT
primary_key
FROM
table_name
GROUP BY
column_name
HAVING
COUNT(*) = 1
);
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)
この回答 に似ていますが、代わりに一時テーブルを使用しました:
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;
SELECT * FROM `table` t1 join `table` t2 WHERE (t1.name=t2.name) && (t1.id!=t2.id)
この方法の方が簡単だと思います。出力には、IDと支払人の電子メールが表示されます。支払人の電子メールは、このテーブルの複数のレコードにあります。結果はIDでソートされます。
SELECT id, payer_email
FROM Paypal_ipn_orders
WHERE COUNT( payer_email )>1
SORT BY id;