Connais pas MySQL mais je peux te le faire en Oracle, je suppute que c'est du SQL assez classique pour que ca marche pareil.
Deja, la tienne ne marche pas parce que ton (SELECT * FROM groupe) n'est pas "connecte" au reste, du coup il suffit qu'il y ait un groupe dans la table Groupe pour que le select retourne quelque chose, et du coup le NOT EXISTS va retourner "faux" (et donc ta requete ne retourne rien puisque le filtre renvoie toujours "faux" ).
T'as plusieurs manieres de faire:
SELECT g.id_groupe FROM groupe g WHERE NOT EXISTS (SELECT 1 FROM appartenir a WHERE a.mail = "unuser@adresse.fr" AND a.id_groupe = g.id_groupe); |
SELECT g.id_groupe FROM groupe g WHERE id_groupe NOT IN (SELECT a.id_groupe FROM appartenir a WHERE a.mail = "unuser@adresse.fr" ); |
SELECT g.id_groupe FROM groupe g LEFT JOIN appartenir a ON a.id_groupe = g.id_groupe AND a.mail = "unuser@adresse.fr" WHERE a.id_groupe IS NULL; |
J'pense que la premiere est la plus "correcte".
La seconde avec le NOT IN parait que c'est pas le plus performant (sous Oracle en tout cas).
Perso je prefere la troisieme (question de gout) mais j'ai remarque que de mettre des filtres directement dans les jointures ca herisse certaines personnes, donc si c'est pour un exo vaut p'tetre mieux rester sur le NOT EXISTS des fois que ton prof soit pointilleux.
Message édité par lasnoufle le 03-10-2013 à 04:34:34
---------------
C'était vraiment très intéressant.