Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jointure entres tables

Mais quelle galère !

Sujet résolu
    9 octobre 2010 à 17:50:35

    Bonjour, amirs zéros !
    Alors voila, pour mon administration, j'aurais souhaiter pouvoir comparer l'adresse IP du membre, suivant celle avec laquelle il s'est inscrit, et avec celle de ses différentes connexions.
    Mais voila, problème : Je dois faire appelle a des jointures de table !

    J'avais penser a faire une requète comme ceci :

    SELECT pseudo.connexions, ip.connexions, date.connexions, heure.connexion, protocol.membre FROM connexions, membre
    


    Mais voila, problème, ma fonctions Fetch() n'éxiste pas, ce qui signifie que c'est c'est ma requète qui déconne.

    J'ai fais exprès de modifier le nom de IP dans membre, pour ne pas avoir interférence.

    Y'a-t-il une alternative ? Mon code est fait pour ne pas marcher ? Des solutions ?
    • Partager sur Facebook
    • Partager sur Twitter
      9 octobre 2010 à 17:54:58

      Tu fais un produit cartésien (avec la vieille syntaxe en plus). Si tu veux faire une jointure (je suppose interne, selon ton problème), alors tu dois utiliser INNER JOIN.

      Comme on n'a pas tes tables, impossible de t'aider. Sinon, dans ta requête, tu as apparemment inverser le nom de la colonne et le nom de la table.
      • Partager sur Facebook
      • Partager sur Twitter
        9 octobre 2010 à 18:09:46

        Citation : Fayden

        Tu fais un produit cartésien (avec la vieille syntaxe en plus). Si tu veux faire une jointure (je suppose interne, selon ton problème), alors tu dois utiliser INNER JOIN.

        Comme on n'a pas tes tables, impossible de t'aider. Sinon, dans ta requête, tu as apparemment inverser le nom de la colonne et le nom de la table.


        Oui, je sais, c'est la vielle syntaxe, mais c'est la seul que je trouve potable. J'ai changé l'ordre Nom de colonne / Nom de la table, mais on en ai toujours au même points ... Pas normal, non ?
        • Partager sur Facebook
        • Partager sur Twitter
          9 octobre 2010 à 18:53:06

          Oui c'est normal, je t'ai déjà dit que tu fais un produit cartésien, pas une jointure. De toute façon, arrête de faire du essais et erreurs, regarde quelle est l'erreur renvoyée par la requête...
          • Partager sur Facebook
          • Partager sur Twitter
            10 octobre 2010 à 10:16:08

            Dans ton select, c'est table.champ , et non pas champ.table comme tu le fais.
            • Partager sur Facebook
            • Partager sur Twitter
              10 octobre 2010 à 14:24:20

              Citation : Fayden

              Oui c'est normal, je t'ai déjà dit que tu fais un produit cartésien, pas une jointure. De toute façon, arrête de faire du essais et erreurs, regarde quelle est l'erreur renvoyée par la requête...



              Cartésien ... Cartésien ? Ce n'est pas un os du pied ? Ou un peuple datant de l'époque des francs ? :p
              Tu n'aurais pas un lien Wikipédia pour que je vois ce que c'est ?

              Citation : Feng Huang

              Dans ton select, c'est table.champ , et non pas champ.table comme tu le fais.



              J'ai ré-inverser ;) Mais j'ai toujours la même erreur :

              Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\mon-mammou\moderation.php on line 25


              Bizarre, non ?

              EDIT : Problème réglé :D Merci le détecteur d'erreur des requête ;)
              Autre petit souci, maintenant, tout marche bien, mais souci, toutes les entrée sont multiplier par trois, ce qui fait que le membre ce que connecte trois fois en même temps ... Mince alors :p
              • Partager sur Facebook
              • Partager sur Twitter
                10 octobre 2010 à 16:37:22

                C'est ça, un produit cartésien.
                Tu prends une table et tu multiplies chaque ligne de la table A par la table B
                Exemple :

                Table A contient les lignes A, B, C
                Table B contient les lignes 1, 2, 3
                Le produit cartésien des deux tables donnerait ceci :
                {A, 1}, {A, 2}, {A, 3}, {B, 1}, {B, 2}, {B, 3}, {C, 1}, {C, 2}, {C, 3}

                Tu veux faire une jointure, tu dois faire une condition. Et comme je l'ai déjà dit, on n'a pas tes tables pour t'aider.

                La syntaxe pour une jointure interne, c'est celle-ci :
                SELECT col1[, col2[, ...]]
                FROM table_name1
                [INNER] JOIN table_name2
                    ON table_name1.column_name = table_name2.column_name
                
                • Partager sur Facebook
                • Partager sur Twitter
                  10 octobre 2010 à 17:31:23

                  D'accord, je comprend mieux. Je récapitule :
                  • SELECT col1, col2 FROM table_A JOIN table_B : Après SELECT, c'est le nom des champs, après FROM, c'et le nom de la table principal, et après JOIN, c'est la table a joindre, non ?
                  • ON table_name1.column_name = table_name2.column_name : Et là, on dit a PHP que le champs un de la table A est égal au champs 2 de la B ? C'est normal ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 octobre 2010 à 17:48:48

                    Citation : Grey

                    • SELECT col1, col2 FROM table_A JOIN table_B : Après SELECT, c'est le nom des champs, après FROM, c'et le nom de la table principal, et après JOIN, c'est la table a joindre, non ?

                    C'est bien ça. Note qu'on parle de colonnes et non de champs.

                    Citation : Grey

                    • ON table_name1.column_name = table_name2.column_name : Et là, on dit a PHP que le champs un de la table A est égal au champs 2 de la B ? C'est normal ?

                    Attention : PHP n'a rien à voir là-dedans. Tu interagis avec le SGBDR (MySQL) lorsque tu fais des requêtes, jamais avec PHP.

                    Et oui, c'est tout à fait normal qu'on lui dise que la colonne de la table A est égale à la colonne de la table B, c'est la condition de jointure. On dit au SGBDR : "Pour chaque ligne dans la table A, joint-lui la ligne de la table B où la colonne X de la table A est égale à la colonne Y de la table B". Par convention, on donne habituellement le même nom à la colonne X et à la colonne Y parce qu'elles contiennent la même chose. Ce n'est pas obligatoire, tu peux tout à fait leur donner deux noms distincts.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 octobre 2010 à 17:57:49

                      J'ai réussi !
                      Voila ma requête :
                      SELECT login, ip, date, heure FROM connexions JOIN membre ON connexions.login = membre.Pseudo

                      Ca a l'air de marcher, même si c'est un peu le 'bordel' ^^
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 octobre 2010 à 18:05:03

                        Bah non, c'est exactement ce qu'il faut faire. Tu peux aussi indenter ta requête comme tu le fais avec ton code PHP par exemple, ça devient vite nécessaire pour les longues requêtes.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 octobre 2010 à 18:07:39

                          Oui, oui, c'est ça :p C'est juste qu'il me sort les entrée dans un ordre au pif !
                          Autre question et je passe mon sujet au vert : Comment faire pour récupérer la chaine de caractère contenue dans membre.Pseudo ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 octobre 2010 à 18:29:35

                            C'est normal qu'il te sorte les lignes aléatoirement : il n'y a pas d'ordre prédéfini dans une table. C'est comme si je te donnais un sac de billes rempli et que je te demandais de me sortir les 10 premières. Tu ne saurais pas quoi faire.
                            Il faut toujours utiliser ORDER BY si on a besoin d'ordonner le résultat.

                            Pour récupérer membre.Pseudo, il ne faut pas oublier de le sélectionner dans ta requête (l'ajouter après SELECT). Dans ton code PHP, tu n'as ensuite qu'à faire ta boucle et utiliser $donnees['Pseudo'] (remplace $donnees par le nom de ta variable, évidemment). Ce n'est jamais nécessaire d'ajouter le nom de la table devant la colonne dans le code PHP.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 octobre 2010 à 18:45:43

                              D'accord, merci beaucoup :D Je passe, cette fois, mon sujet au vert !
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Jointure entres tables

                              × 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