Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requete SQL jointure

Ou est le probleme ?

    15 novembre 2010 à 11:27:08

    Bonjour à tous !

    J'ai lu et relu le tuto sur les jointures entre tables mais je n'arrive toujours pas à mes fins.
    J'ai deux tables :

    - Categorie : id, categorie, dispo, etat, datepostulation.
    - Competence : idcategorie, type, competence.

    Je joint donc grace aux entrées que j'ai mis en gras.
    Voici ma requête :

    SELECT UNIX_TIMESTAMP(ca.datepostulation) as date, ca.id, ca.idmembre as idmembre, 
    ca.etat, ca.categorie, co.competence as competence 
    FROM categories AS ca INNER JOIN competences as co ON ca.id = co.idcategorie WHERE ca.categorie = "Développeur" AND ca.etat="1" AND co.type="spe"  AND co.competence="PHP/MYSQL"
    


    Je veux enfaite afficher pour chaque membre ceux qui ont pour ca.categorie= Développeur et dont les compétence de type=spe sont le PHP/MYSQL.
    Or cette requête me donne deux ou trois resultat par membre avec un affichage qui veut rien dire etc...

    Ou est le problème dans cette requête ?
    Merci d'avance !
    T'ry.
    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2010 à 11:30:14

      Dans la bataille où est passée ta table membre ?

      Tracker
      • Partager sur Facebook
      • Partager sur Twitter
        15 novembre 2010 à 11:33:23

        Bien vu :)

        Voila la nouvelle requete que j'ai faites :

        SELECT co.competence, co.type, co.temps, co.note, co.id, ca.dispo as dispo, ca.refs, m.pseudo, ca.id AS idcategorie,
        ca.categorie, DATE_FORMAT(datepostulation, "%d/%m/%Y") AS date, m.categorie AS droitsmembre, m.id AS idmembre
        FROM categories AS ca LEFT JOIN membres AS m ON m.id=ca.idmembre
        LEFT JOIN competences AS co ON co.type="spe" AND co.idcategorie=ca.id WHERE m.valide=1 AND ca.etat=1 AND ca.categorie="Développeur"
        


        C'est un peu plus clair mais l'affichage se fait en fonction des compétence (une ligne par compétence) et non pas en fonction de la personne :(
        • Partager sur Facebook
        • Partager sur Twitter
          15 novembre 2010 à 11:44:44

          C'est pas cohérent de retrouver une table à droite d'un LEFT JOIN dans le WHERE, recommence...

          Au passage que fout l'idmembre dans une catégorie ?

          Tracker.
          • Partager sur Facebook
          • Partager sur Twitter
            15 novembre 2010 à 11:46:51

            J'avais remis l'idmembre dans la table catégorie au cas ou pour + de simplicité...
            Mais je comprend pas ce que tu veux dire, merci de ton intérêt mais je galère depuis environ 2 heures je ne vois pas qu'est ce qui cloche. :(
            • Partager sur Facebook
            • Partager sur Twitter
              15 novembre 2010 à 11:48:49

              Tu as un soucis de logique si tu mets l'idmembre dans catégorie, tu crées une relation définissant que pour 1 catégorie tu n'as qu'1 seul membre ?!

              [ed]
              Si un membre ne peut avoir qu'une seul compétence, tu dois retrouver un id_competence dans ta table membre, s'il peut en avoir plusieurs, il te manque une table d'association.

              Ensuite, c'est sans doute les compétences qui sont catégorisées donc l'id_categorie doit appartenir à la table compétence si tu n'admets qu'un seule catégorie/compétence sinon il te manque encore une table...
              [/ed]

              Tracker.
              • Partager sur Facebook
              • Partager sur Twitter
                15 novembre 2010 à 11:56:07

                Enfaite la structure est particulère, regardes :

                Image utilisateur
                • Partager sur Facebook
                • Partager sur Twitter
                  15 novembre 2010 à 11:57:54

                  Pourquoi elle est particulière ? Moi je n'aurais mis que les ID déjà.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 novembre 2010 à 12:00:49

                    Particulier ça n'existe pas vraiment... :)
                    Comment s'appelle la table que tu nous montres (on dirait des posts donc post ou message c'est sont nom ?)


                    Tracker.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 novembre 2010 à 12:04:04

                      C'est la table catégorie.
                      Enfaite le principie est le suivant :

                      L'individu s'inscrit en tant que developpeur par exemple, ses information vont dans cette table et dans membres. Lorsqu'il s'inscrit on lui demande également ses compétence qui vont dans la table compétence.
                      Suis-je clair ? o_O^^
                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 novembre 2010 à 12:07:23

                        Non, pour le moment on a
                        - Des membres stockés dans une table MEMBRE
                        - Des compétences stockées dans une table COMPETENCE
                        - Un table MEMBRE_COMPETENCE définissant qui sait faire quoi

                        A quoi sert catégorie, et surtout à quoi correspond le champs refs de cette dernière ?

                        Tracker.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 novembre 2010 à 12:12:16

                          Nan enfaite on ne parle que de 3 tables

                          -Membres
                          -Compétence
                          Image utilisateur

                          - Et categorie
                          Image utilisateur

                          Enfaite j'ai inclu dans categorie certaines informations comme la motivation (refs) ou la disponibilité (dispo) etc...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 novembre 2010 à 12:27:01

                            Alors en fait:

                            - MEMBRE OK
                            - Ta table COMPETENCE correspond à ce que ce j'appellais MEMBRE_COMPETENCE
                            - finalement tu n'as pas de table définissant les compétences.

                            après
                            - l'id_categorie appartient à ta pseudo table COMPETENCE, donc une catégorie par compétence (enfin j'espère sinon bonjour le merdier, car la compétence étant définie plusieurs fois la catégorie correspondante pourrait varier).

                            J'ai fini par comprendre que toutes les infos (ou presque) de catégorie correspondaient à un dernier POST...


                            Bref pour en revenir à ton problème, hormis toutes les erreurs de design de ta base, ta requête se résume à
                            select m.*
                            from   membre m
                                   inner join competence co
                                     on co.idmembre = m.id
                                     and co.competence = 'PHP/MYSQL'
                            -- si tu peux avoir le même nom de compétence dans plusieurs catégories        
                                   inner join categorie ca
                                     on ca.categorie = 'Développeur'
                                     and ca.id = co.idcategorie
                            


                            Tracker.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 novembre 2010 à 12:36:53

                              Merci en tout cas du temps que tu m'accordes.
                              Ta requête fonctionne. Mais le HIC c'est que je l'effectue dans le cadre d'une recherche.
                              Donc enfaite cette ligne : and co.competence = 'PHP/MYSQL'
                              peut disparaitre si la recherche se fait sans critère. or si on la supprime on se retrouve dans la même situation que tout à l'heure c'est à dire une ligne par compétence...

                              Un véritable casse-tête :(

                              Voila l'exemple de recherche sans critère :

                              Image utilisateur
                              Je résume ce que je cherche à faire : Je veux afficher ligne par ligne comme sur l'image les compétences de type spe(table compétences), la disponibilité et la date de postulation de chaque membre.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                15 novembre 2010 à 14:00:26

                                Citation

                                Donc enfaite cette ligne : and co.competence = 'PHP/MYSQL'
                                peut disparaitre si la recherche se fait sans critère


                                A toi de supprimer la clause quand tu génères ton ordre...
                                Sinon si ton projet n'est pas trop avancé, revois ta base.

                                Tracker.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 novembre 2010 à 17:01:08

                                  Nan je me suis mal expliqué. Si je fait disparaitre cette ligne, il se passe comme sur l'image, c'est à dire que ta requête donne le même resultat que l'initiale !
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 novembre 2010 à 9:31:59

                                    C'est normal, tu auras autant de fois le même membre dans ton résultat que tu auras de compétences (pour le membre) relatives à la catégorie recherchée.
                                    La question à te poser c'est:
                                    - cherches-tu des membres ? si oui (select distinct ...)
                                    - cherches-tu les compétences des membres ? si oui (select m.*, co.* ...)


                                    Tracker.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Requete SQL jointure

                                    × 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