2 votes

Trouver des lignes, où le nom varie, mais pas l'adresse postale

J'ai le problème suivant, qui me brûle l'esprit.

Imaginez le tableau suivant (le second_id n'est pas important et dire que je devrais utiliser unique() ne fonctionne pas dans mon cas)

create table adressen (

id int PRIMARY KEY AUTO_INCREMENT,
second_id int,
name char(64),
email char(64)
);

INSERT INTO adressen (second_id, name, email) VALUES ('1','max','max@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('1','peter','peter@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('1','emma','emma@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('2','max','max@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('2','peeter','peter@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('2','emma','emma@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('3','maax','max@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('3','elisa','elisa@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('3','eemmaa','emma@test.com');

Comme vous pouvez le voir, il y a plusieurs utilisateurs avec le même mail, mais avec des noms différents. J'essaie de sélectionner tous les courriers pour lesquels il existe plusieurs noms.

Dans ce cas, ce serait :

  • emma@test.com avec les deux noms différents ( emma , eemmaa )

  • max@test.com avec les deux noms différents ( max , maax )

  • peter@test.com avec les deux noms différents ( peter , peeter )

La sortie sera donc une ligne pour chaque "ensemble" de nom et de mail, comme :

emma@test.com , emma
emma@test.com , eemmaa
max@test.com, max
max@test.com, maxx
petertest.com, peter
petertest.com, peeter

Je ne veux pas obtenir les lignes où le mail et le nom sont identiques. Je ne veux pas non plus obtenir une ligne s'il n'y a qu'une seule entrée (dans ce cas pour karl) dans ma table.

Merci beaucoup pour votre aide !

2voto

Ollie Jones Points 20488

Obtenez d'abord un ensemble de résultats contenant les adresses électroniques dupliquées.

              SELECT mail
                FROM tbl
               GROUP BY mail
              HAVING COUNT(*) > 1

Utilisez ensuite cette table comme une table virtuelle et joignez-la à votre table détaillée.

  SELECT a.mail, a.name
    FROM tbl a
    JOIN (
              SELECT mail
                FROM tbl
               GROUP BY mail
              HAVING COUNT(*) > 1
         ) b ON a.mail = b.mail
   ORDER BY a.mail, a.name

Vous pouvez essayer de dédupliquer l'ensemble des résultats comme ceci :

  SELECT DISTINCT a.mail, a.name
    FROM tbl a
    JOIN (
              SELECT mail
                FROM tbl
               GROUP BY mail
              HAVING COUNT(*) > 1
         ) b ON a.mail = b.mail
   ORDER BY a.mail, a.name

2voto

Barmar Points 135986

Utilisez une sous-requête qui trouve tous les mail avec plus d'une valeur différente name et se joindre à la table elle-même.

SELECT DISTINCT a.mail, a.name
    FROM tbl a
    JOIN (
              SELECT mail
                FROM tbl
               GROUP BY mail
              HAVING COUNT(DISTINCT name) > 1
         ) b ON a.mail = b.mail
   ORDER BY a.mail, a.name;

DEMO

Cette réponse est basée sur la réponse de O. Jones, mais ajoute COUNT(DISTINCT name) afin que les lignes qui ont le même nom et la même adresse électronique ne soient pas comptées comme des doublons.

0voto

Harshil Doshi Points 2644

Essayez ça :

SELECT distinct mail,name FROM table 
      WHERE mail IN (SELECT mail FROM table GROUP BY mail HAVING COUNT(distinct name) > 1)
  order by mail,name;

J'espère que cela vous aidera !

0voto

isaace Points 2910

Inspiré par la réponse et les commentaires de O Jones

Cela devrait fonctionner

SELECT DISTINCT a.mail, a.name
FROM tbl a
JOIN (
          SELECT mail
            FROM tbl
           GROUP BY mail
          HAVING COUNT(DISTINCT name) > 1
     ) b ON a.mail = b.mail
ORDER BY a.mail, a.name

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X