Partage
  • Partager sur Facebook
  • Partager sur Twitter

Une requête SQL un peu chiante

    16 janvier 2006 à 13:32:51

    Bonjour,

    J'ai consulté ce site pour apprendre un peu de PHP, en vue de développer un intranet pour ma boîte.
    J'en arrive à une partie un peu relou, qui consiste à créer un annuaire pour mon équipe.


    En fait, j'utilise une base de données MySQL, où j'ai mis plusieurs tables.
    Une table contact qui contient des données comme : Nom, Prénom, Téléphone, E-Mail, Site.
    Une table applications qui contient la liste des applications utilisées par les différentes personnes, que j'utiliserai pour déterminer qui gère telle ou telle application.
    Enfin, une table Centre de Compétence qui contient toutes les équipes (sachant qu'une personne peut appartenir à plusieurs équipes, bien que ce soit rare).

    Il y a également 2 tables qui font le lien entre contact et application, et entre contact et centre de compétence.


    Après discussion, nous avons décidé de créer un formulaire dans notre page contenant plusieurs champs, qu'on peut remplir ou laisser vide.

    Un champ de texte nom, un autre champ de texte application, une liste déroulante centre de compétence et une autre liste déroulante site.

    Donc, en envoyant ce formulaire vers une page.php et en récupérant les données POST, je voudrais savoir comment écrire ma requête pour rechercher les informations dont j'ai besoin.

    En fait, j'ai fait une requête un peu bancale, c'est à dire que si je tape un nom dans le champ "nom" et que je sélectionne un centre de compétence qui n'a rien à voir avec cette personne, la requête me retourne tous les champs concernés : Les informations sur la personne dont j'ai tapé le nom, ainsi que toutes les personnes appartenant au centre de compétence sélectionné.
    Or, je voudrais que la requête ne me retourne que les personnes concernées par TOUS les champs en même temps.
    Pour ça, je crois que j'ai fait une requête qui marche à peu près, le problème suivant étant que je suis obligé de remplir tous les champs, sinon la requête ne me retourne aucun résultat.
    Et moi, je voudrais qu'il y aie possibilité de ne pas tout remplir (si on connait le nom de la personne, on ne tape que son nom, ou bien si on cherche l'ensemble des personnes dans un même centre de compétence, on n'utilise que la liste déroulante, etc...).

    Quelqu'un aurait il le courage de m'expliquer comment faire ? Merci beaucoup d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      16 janvier 2006 à 13:50:49

      Hip,

      Tu demandes d'expliquer en deux temps trois mouvements, le comment du pourquoi d'une recherche multicritères liant plusieurs tables.

      Bah la réponse va être vite faites : IMPOSSIBLE ! :-°
      Du moins sans avoir devant les yeux la structure des dites tables, les différents critères de sélection ainsi que les zones de recherches. ;)

      Nous ne sommes pas là pour coder à ta place. ^^
      Montre-nous tes requêtes bancales en les expliquant et peut-être que les réponses viendront.

      Tu parles de liste déroulante... comment est-elle conçue, avec quels éléments ?
      Est-ce du statique, du dynamique (extrait d'une table) ????
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        16 janvier 2006 à 14:14:33

        moi j'écrirais plusieurs if..elseif avec en condition (isset($_POST['']) contenant des requetes différentes. J pense pas que ca soit possible de gérer une recherche multi-critère avec une seule requete. Maintenant j m trompe peu être mais j vois pas trop comment ca peut être possible vu qu on ne peut pas utiliser d'alternative en sql.
        • Partager sur Facebook
        • Partager sur Twitter
          16 janvier 2006 à 14:46:11

          Citation : Benzawal

          ... mais j vois pas trop comment ca peut être possible vu qu on ne peut pas utiliser d'alternative en sql.


          Ah non ?
          Et un OR dans une requête c'est pas une alternative ?
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            16 janvier 2006 à 14:51:01

            si mais bon... pour avoir une requete qui ressemble a

            WHERE (.. AND .. AND .. AND ..) OR (.. AND .. AND ..) OR (.. AND .. AND .. AND ..)

            j préfère de loin plusieurs if imbrique dans mon code php. De plus que le moteur php est plus rapide que le moteur sql.

            Maintenant si t'as une requete qui pourrait etre toute simple, ca m'interesse parce que j vois pas comment faire.
            • Partager sur Facebook
            • Partager sur Twitter
              16 janvier 2006 à 15:21:32

              T'as jamais fait de la requête dynamique me semble t'il ?
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                16 janvier 2006 à 15:26:39

                Et non... par contre je veu bien que tu expliques comment faire plutot que de dire que c'est possible.. Ou du moins donner des pistes..
                • Partager sur Facebook
                • Partager sur Twitter
                  17 janvier 2006 à 9:57:21

                  Merci pour vos réponses, c'est vrai que j'ai pas été très précis pour le code. J'ai quand-même un début de réponse, à savoir que je me demandais s'il fallait plutôt faire des if à foison avec une requête différente à chaque fois ou s'il était possible de le faire directement dans ma requête.

                  Autrement, mes tables sont ainsi :

                  Contact :
                  - Ident
                  - Nom
                  - Prénom
                  - Site
                  - Téléphone
                  - Mail

                  CC : (centre de compétence)
                  - Ident
                  - CC
                  - Mail (il s'agit du mail générique des équipes, contrairement au mail perso présent dans la table contact)

                  cclien :
                  - Ident
                  - contact (qui contient l'ident du contact)
                  - cc (qui contient l'ident du cc)


                  Pour les applis, on verra plus tard, disons simplement qu'on ne prend que ces 3 tables en compte.

                  Mon formulaire se présente ainsi :

                  Un champ texte où on peut mettre le nom de la personne.
                  Une liste déroulante avec tous les centres de compétence : Je parcoure ma table cc, le texte affiché étant le nom du cc, et la valeur associée (que je récupère en POST) étant son ident (sachant que si je ne sélectionne rien, la valeur associée est 0).


                  J'ai fait une requête comme ceci :

                  SELECT DISTINCT contact.nom, contact.prenom, contact.site, contact.mail, contact.telephone, cc.cc, cc.mail
                  FROM contact
                  INNER JOIN cclien ON (contact.ident = cclien.contact)
                  INNER JOIN cc ON (cclien.cc = cc.ident)
                  WHERE contact.nom = '$nom'
                  OR cclien.cc = '$cc'


                  Les variables $nom et $cc sont les données POST que j'ai chopé à partir du formulaire.
                  Faisant ainsi, lorsque je rentre le nom d'un gars qui appartient à l'équipe micro, et que je sélectionne "helpdesk" dans le centre de compétence, la requête me renvoie les données du gars dont j'ai rentré le nom, plus toutes les personnes du helpdesk.

                  Si je change le "OR" en "AND", je suis obligé de remplir les 2 champs (de taper le nom du gars ET de sélectionner son CC) pour que la requête me retourne le résultat voulu, ce qui n'est pas non plus ce que je veux...

                  J'espère avoir été un peu plus précis... Est-ce que j'ai besoin de faire des IF et de couvrir toutes les possibilités (sachant qu'au final il y aura 4 champs différents) ou est-ce qu'il y a une façon de faire ce "tri" dans ma requête ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    17 janvier 2006 à 12:41:01

                    Comme je l'ai déjà dit plus haut, j vérifierais si les POST contiennent des données ou pas.

                    Maintenant si quelqu'un sait comment faire avec une seule requète...
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Une requête SQL un peu chiante

                    × 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