web-dev-qa-db-fra.com

Sélectionner et afficher uniquement les enregistrements en double dans mysql

Cette question est assez simple pour une raison quelconque, je ne peux pas obtenir le résultat approprié pour afficher uniquement les enregistrements en double.

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

exemple de sortie 

id       tot
1         2
4         2

production attendue

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

Comment puis-je y arriver? 

21
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

46
lc.

La IN était trop lente dans ma situation (180 secondes)

J'ai donc utilisé une JOIN à la place (0.3 s)

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
10
Timo Huovinen

voici l'exemple simple: 

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

Cela fonctionnera vraiment. :)

2
Gaurav Gupta

Obtenez une liste de toutes les lignes en double de la table:

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

utiliser ce code 

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

Salut ci-dessus réponse ne fonctionnera pas si je veux sélectionner une ou plusieurs valeurs de colonne qui ne sont pas identiques ou peuvent être identiques pour les deux données de ligne 

Pour ex. Je veux sélectionner un nom d'utilisateur, date de naissance aussi. Mais dans la base de données est le nom d'utilisateur n'est pas dupliqué mais la date de naissance sera dupliquée alors cette solution ne fonctionnera pas.

Pour cela, utilisez cette solution Nécessité de prendre la même jointure sur la même table /

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

La requête ci-dessus renverra tous les enregistrements ayant le même email_id et la même date de naissance

1
Sameer Kazi

Cela fonctionne le plus vite pour moi

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

Similaire à cette réponse , bien que j'aie utilisé une table temporaire à la place:

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

Je pense que cette façon est la plus simple. La sortie affiche l'identifiant et l'adresse de messagerie du payeur, qui se trouve dans plusieurs enregistrements de cette table. Les résultats sont triés par identifiant.

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