Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comparaison SQL

Sujet résolu
    12 juillet 2022 à 11:36:10

    Bonjour à tous,

    Je débute en SQL je viens donc solliciter votre aide.

    J'ai une table de locaux, avec des colonne : nomLocal, numeroBatiment, numeroService
    A un numéro de bâtiment correspond un numéro de service. Exemple pour le bâtiment 01 , le numéro de service sera 01A, ect... Un locaux appartient à un batiment et donc à un numéro de service.

    L'idée est de créer une requête qui me permet de détecter les locaux appartenant à un bâtiment n'ayant pas le bon numéro de service. Exemple le localxxx du batiment 01 à un numéro de service 02A alors que le numéro de service devrait etre 01A.


    SELECT *
    FROM   locaux
    WHERE  nomLocal LIKE '%LOCAL%'
           AND numeroBatiment IN (SELECT DISTINCT numeroBatiment
                                    FROM   locaux
                                    WHERE  nomLocal LIKE '%LOCAL%')
           AND numeroService IN (SELECT DISTINCT numeroService
                        FROM   locaux
                        WHERE  nomLocal LIKE '%LOCAL%')


    J'ai commencé par cette requete mais ensuite je suis un peu perdu sur comment comparer le numéro de service d'un local avec celui auquel il est censé appartenir.
    Auriez vous une piste de travail ? Ou une approche à proposée ?

    Merci d'avance pour votre temps. 

    -
    Edité par FloRiaRe 12 juillet 2022 à 11:36:25

    • Partager sur Facebook
    • Partager sur Twitter
      12 juillet 2022 à 12:05:16

      Bonjour,

      La question que tu poses laisse à penser à un problème de conception de la base de données ...

      Avant de répondre j'aimerais avoir plus de détails.

      Tu as des locaux, des bâtiments et des services.

      Un local est lié à un bâtiment et un bâtiment peut avoir plusieurs locaux (relation 1,n) ?

      Un bâtiment est lié à un service et un service peut avoir plusieurs bâtiments (relation 1,n) ?

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

        Bonjour  Benzouye,

        Oui j'ai une table avec des locaux, une autre avec des batiments, et une autre avec des services. 

        Dans la table avec les locaux, on retrouve les colonnes nomLocal,numeroBatiment,numeroService.

        Un local est lié à un bâtiment et un bâtiment peut avoir plusieurs locaux (relation 1,n) ?

        Oui un bâtiment peut avoir plusieurs locaux.  

        Un bâtiment est lié à un service et un service peut avoir plusieurs bâtiments (relation 1,n) ?

        Non, un local est lié à un service et un service peut avoir plusieurs locaux. 

        En gros je cherche à faire cette requête car je vérifie le service d'affectation des locaux d'un bâtiment régulièrement, tel que : 

        Select * from locaux
        
        where nomlocal like '%LOCAL%'
        
        and numeroBatiment = '01'
        
        and numeroService != '0001A' 
        
        
        
        

        et ceci pour chaque bâtiment. Mon idée est de pouvoir faire cette vérification pour chaque locaux en une seule fois. 

        • Partager sur Facebook
        • Partager sur Twitter
          12 juillet 2022 à 17:30:17

          FloRiaRe a écrit:

          un local est lié à un service et un service peut avoir plusieurs locaux

          C'est contradictoire avec ton énoncé de départ :

          FloRiaRe a écrit:

          A un numéro de bâtiment correspond un numéro de service. Exemple pour le bâtiment 01 , le numéro de service sera 01A, ect... Un locaux appartient à un batiment et donc à un numéro de service

          Si un local est lié à un bâtiment, et qu'un service est lié à un bâtiment, le service n'est pas directement lié au local.

          Pour moi ton modèle devrait être celui-ci :

          Ce qui supprime ton problème car un local est affecté à un bâtiment qui du coup est affecté à un service, donc ton local est indirectement lié au service de son bâtiment ... Impossible alors d'avoir un local affecté à un mauvais service ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            12 juillet 2022 à 17:53:27

            Un truc que j'ai du mal à comprendre, c'est pourquoi le numéro de service semble dépendre du numéro de bâtiment.

            De ce que je crois avoir compris, c'est que numéro_service est une concaténation du numéro_bâtiment et d'autre chose (une lettre correspondant au service?)

            J'ai donc l'impression qu'il y a une certaine redondance d'une info et donc dans ce cas-là, le numéro_service devrait plutôt être cette lettre ? (encore une fois, si j'ai bien compris)

            • Partager sur Facebook
            • Partager sur Twitter
              12 juillet 2022 à 18:25:35

              Comme décris juste avant, je pense que le service est lié au bâtiment, pas au local, d'où ma proposition de modèle :

              Benzouye a écrit:

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                13 juillet 2022 à 8:33:33

                Dans la table LOCAL, j'ai une FK vers la table Batiment mais pas vers Service. 

                Dans la table BATIMENT, je n'ai pas de FK vers LOCAL ou vers Service. 

                Dans la table SERVICE, je n'ai pas de FK vers LOCAL ou vers Service 

                • Partager sur Facebook
                • Partager sur Twitter
                  13 juillet 2022 à 9:03:48

                  FloRiaRe a écrit:

                  Dans la table LOCAL, j'ai une FK vers la table Batiment mais pas vers Service

                  FloRiaRe a écrit:

                  Dans la table avec les locaux, on retrouve les colonnes nomLocal,numeroBatiment,numeroService

                  C'est quoi la colonne numeroService alors ?

                  Dans tous les cas, je te propose de supprimer la colonne numeroService de la table local et de la déplacer dans la table batiment avec une FK ...

                  Benzouye a écrit:

                  Ce qui supprime ton problème car un local est affecté à un bâtiment qui du coup est affecté à un service, donc ton local est indirectement lié au service de son bâtiment ... Impossible alors d'avoir un local affecté à un mauvais service ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    13 juillet 2022 à 9:08:48

                    Oki doki je vais faire ça. 

                    Je me permet une question : est il possible de faire une comparaison entre les données d'une colonne par exemple ici le LOCAUX et son numéro de service et un numéro de service ? Le tout dans des sous requêtes ? 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 juillet 2022 à 9:13:28

                      Dans ton problème de départ la difficulté est justement la valeur de comparaison pour le service. D'où proviendrait-elle ?

                      Dans ton exemple :

                      FloRiaRe a écrit:

                      Select * from locaux
                      where nomlocal like '%LOCAL%'
                      and numeroBatiment = '01'
                      and numeroService != '0001A' 
                      

                      D'où provient le 0001A ? Comment le déterminer de manière générique ? Cela me semble impossible, mais as-tu une idée ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        13 juillet 2022 à 9:20:43

                        Je pensais faire un

                        SELECT DISTINCT NumeroService FROM LOCAL
                        
                        WHERE nomLocal LIKE '%LOCAL%'

                        Imbriquer le tout avec le numéro de bâtiment et comparer l'ensemble.

                        Exemple : Si LOCAL est dans le Bâtiment 01 alors vérifier que le numéro de service est 0001A

                        Mais même si possible c'est au delà de mes compétences, je vais tenter une autre approche et prendre le problème autrement :)

                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 juillet 2022 à 10:04:43

                          Ce que je voudrais savoir, c'est d'où vient ce "0001A" ? Il se construit à partir de quoi ? Du nom du bâtiment ? Du nom du local ?

                          Et je me répète, mais :

                          Benzouye a écrit:

                          Dans tous les cas, je te propose de supprimer la colonne numeroService de la table local et de la déplacer dans la table batiment avec une FK ...

                          Ce qui supprime ton problème car un local est affecté à un bâtiment qui du coup est affecté à un service, donc ton local est indirectement lié au service de son bâtiment ... Impossible alors d'avoir un local affecté à un mauvais service ...

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            13 juillet 2022 à 10:50:44

                            Le numéro de service est construit arbitrairement, on pourrait mettre "toto" à la place de "0001A" .
                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 juillet 2022 à 11:40:28

                              Si dans la table LOCAL tu as ces deux lignes :

                              nomLocalnumeroBatimentnumeroService
                              Local 1 01 0001A
                              Local 2 01 0002B

                              Comment savoir lequel des deux codes service est le bon pour le bâtiment 01 ?

                              Où se fait l'association entre un bâtiment et son code service ?

                              -
                              Edité par Benzouye 13 juillet 2022 à 11:40:43

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                              Comparaison SQL

                              × 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