Partage
  • Partager sur Facebook
  • Partager sur Twitter

Operateur NOT IN different de IN?

Sujet résolu
    27 mars 2022 à 18:12:42

    Bonjour,

    J'ai un résultats surprenant sur une requête utilisant l’opérateur NOT IN.

    select distinct race_id from Animal

    me renvoie une liste id ( a savoir 1,2,3,5: et donc pas 4).

    Maintenant si j’exécute la requête

    select r.nom,r.id
    from Race as r
    where r.id NOT IN (select distinct race_id from Animal);
    

    La base de donnée me renvoie empty (il me dit qu'il n'y a pas d'entrée dans ma base qui correspond à cela)

    or si j'execute

    select r.nom,r.id
    from Race as r
    where r.id = 4;
    

    Il me renvoie un résultat.

    Pourquoi la requête NOT IN me renvoie une valeur vide alors qu'il est censé me renvoyé le même résultat que ma dernier requête ?



    • Partager sur Facebook
    • Partager sur Twitter
      28 mars 2022 à 9:07:24

      Bonjour,

      C'est bien étrange en effet ... sauf si Race.id 4 n'existe pas ...

      Peux-tu poster le résultat de :

      SELECT * FROM Race

      Peux-tu poster le résultat de :

      SELECT R.*
      FROM
          Race R
              LEFT JOIN Animal A
                  ON R.id = A.race_id
      WHERE A.race_id IS NULL

      -
      Edité par Benzouye 28 mars 2022 à 9:08:13

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        28 mars 2022 à 10:08:31

        Il ne s'agit pas de race.id 4 mais 7 qui devrait être retourner. Mais cela ne change rien la requête devrait renvoyé la ligne sphynx comme avec ta jointure LEFT.

        Je ne comprend vraiment pas pourquoi la dernière renvoie vide


        -
        Edité par taloche65 28 mars 2022 à 10:12:00

        • Partager sur Facebook
        • Partager sur Twitter
          28 mars 2022 à 10:21:26

          Alors ça c'est magique ! Mon LEFT JOIN devrait bien retourner la même chose que ton NOT IN ...

          Nous devons passer à côté de quelque chose, mais je ne vois pas quoi ... o_O

          Peux-tu poster le résultat de :

          SELECT * FROM Animal

          Et le résultat de :

          SELECT DISTINCT race_id FROM Animal
          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            28 mars 2022 à 10:54:02

            SELECT * FROM Animal

            Retourne trop d'entrée,mais j'ai regarder et il n'y à pas l'entrer 7 (confirmé par la requête avec le distinct).

            J'en suis à me demander si mysql n'interprète pas le NOT IN différemment des autres SGBD (mais je n'ai pas trouver d'information sur internet me confirmant mon hypothèse).

            • Partager sur Facebook
            • Partager sur Twitter
              28 mars 2022 à 11:32:47

              Sur ton screen aucun n'a race_id = 7 mais beaucoup sont NULL

              Après étant donné que NULL <> NULL, un IN comme un NOT IN ne feront jamais apparaître une valeur NULL (elles sont de fait exclues par la condition). Ce qui expliquerait que le NOT IN ne renvoie rien mais qu'un LEFT JOIN, qui inclut les NULL (WHERE A.race_id IS NULL), donnent 2 résultats différents, le premier n'incluant pas les valeurs NULL contrairement au second.

              -
              Edité par julp 28 mars 2022 à 11:37:38

              • Partager sur Facebook
              • Partager sur Twitter
                28 mars 2022 à 11:36:35

                tu peux essayer les requêtes

                SELECT * FROM Race WHERE Race.id NOT IN (1,2,3,4,5,8)

                et

                SELECT * FROM Race WHERE Race.id NOT IN (NULL,1,2,3,4,5,8)

                Je pense que le problème vient d'une interprétation du NULL ( https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html )


                • Partager sur Facebook
                • Partager sur Twitter
                  28 mars 2022 à 11:45:08

                  L'explication de Julp est correcte.

                  Ta requête avec NOT IN revient à écrire :

                  WHERE r.id NOT IN ( 1, 2, 3, ..., NULL )

                  Pour MySQL cela revient à écrire :

                  WHERE r.id <> 1
                  AND r.id <> 2
                  AND r.id <> 3
                  AND r.id <> ...
                  AND r.id <> NULL

                  La dernière condition sera toujours fausse.

                  EDIT : On se percute avec umfred ;)

                  -
                  Edité par Benzouye 28 mars 2022 à 11:46:03

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    28 mars 2022 à 12:14:13

                    C'est exactement cela. J'ai tester les requêtes de umfred et effectivement la valeur NULL viens court-circuiter.

                    J'ai adapté la requête et maintenant celle-ci est fonctionnelle.

                    Merci à tous pour votre aide.

                    select r.nom,r.id
                    from Race as r
                    where r.id NOT IN (select distinct race_id from Animal where race_id IS NOT NULL);
                    



                    • Partager sur Facebook
                    • Partager sur Twitter

                    Operateur NOT IN different de IN?

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown