IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

sql pour lier deux tables


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut sql pour lier deux tables
    Bonjour

    Je voudrai faire une requête SQL entre 2 tables sur une base donnée exemple ci-dessous.

    Mon but est de récupérer toutes les lignes de la table inscris + les lignes de la table cheveux seulement les n_inscr sont égaux.

    base de donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    CREATE DATABASE `exmple` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
    USE `exmple`;
     
    CREATE TABLE `cheveux` (
      `n_inscr` int(11) NOT NULL,
      `n_chev` int(11) NOT NULL auto_increment,
      `cheveux` varchar(250) NOT NULL,
      PRIMARY KEY  (`n_chev`),
      KEY `n_inscr` (`n_inscr`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    INSERT INTO `cheveux` (`n_inscr`, `n_chev`, `cheveux`) VALUES
    (1, 1, 'Blond'),
    (3, 2, 'Chatain');
     
    CREATE TABLE `inscrit` (
      `n_inscr` int(11) NOT NULL auto_increment,
      `surnom` varchar(250) NOT NULL,
      PRIMARY KEY  (`n_inscr`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
     
     
     
    INSERT INTO `inscrit` (`n_inscr`, `surnom`) VALUES
    (1, 'lili_256'),
    (2, 'lola_16'),
    (3, 'pat_11'),
    (4, 'dam_16');
    Mon but est d'obtenir ce résultat ci-dessous en mysql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    Array
    (
        [0] => Array
            (
                [0] => 1
                [1] => lili_256
                [2] => Blond
            )
     
        [2] => Array
            (
                [0] => 2
                [1] => lola_16
                [2] => 
            )
     
        [3] => Array
            (
                [0] => 3
                [1] => pat_11
                [2] => Chatain
            )
     
        [4] => Array
            (
                [0] => 4
                [1] => dam_16
                [2] => 
            )
    )
    j'ai essayé plusieurs méthode sql sans succès.

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    $sqe=mysql_query("SELECT a.n_inscr,a.surnom,b.cheveux FROM inscrit a, cheveux b WHERE a.n_inscr=b.n_inscr ");
    $i=0;
    while($rb=mysql_fetch_object($sqe)){
                           $var[$i][0]=$rb->n_inscr;
                           $var[$i][1]=$rb->surnom;
    					   $var[$i][2]=$rb->cheveux;
    					   $i++;
    					               }
    //resultat
    //Array
    //(
    //    [0] => Array
    //        (
    //            [0] => 1
    //            [1] => lili_256
    //            [2] => Blond
    //        )
    //
    //    [1] => Array
    //        (
    //            [0] => 3
    //            [1] => pat_11
    //            [2] => Chatain
    //        )
    //
    //)
    Comment faire ?

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 220
    Points : 28 201
    Points
    28 201
    Par défaut
    Dans ta requete tu utilise une jointure interne (sous une forme que je déteste au plus point, mais là n'est pas le sujet).
    Cette requete ne te renverra que les lignes de la table de gauche (la première) qui auront obligatoirement une ou plusieurs correspondances dans la table de droite (la seconde).

    Si tu veux en plus rajouter les lignes de la table de gauche qui n'ont pas de correspondance dans la table de droite, il faut passer par une jointure dite Externe Gauche (et correctement écrite selon mes goûts) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT a.n_inscr,a.surnom,b.cheveux FROM inscrit a LEFT OUTER JOIN cheveux b ON a.n_inscr=b.n_inscr

    PS : Ta requete initiale correctement écrite selon mes gouts aurait donné ceci :
    SELECT a.n_inscr,a.surnom,b.cheveux FROM inscrit a INNER JOIN cheveux b ON a.n_inscr=b.n_inscr

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut rep
    Te fâche pas mais c'est quoi ce join à la place du where.

    Donc si je comprends bien il existe d'autres requêtes qu'avec le where.

    Mince il va falloir que je trouve un tutoriel pour comprendre.

    En tout cas merci la solution fonctionne.

    Je pouvais toujours chercher avec la clause WHERE.

    Peux-tu me dire où est ce qu'il y a un tutoriel complet pour toutes les fonctions possible en sql.
    Sinon je vais en acheter un demain.

    Merci pour la solution

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut rep
    Demande rapide

    quel method avec join il faut employer pour avoir ceci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Array
    (
        [0] => Array
            (
                [0] => 1
                [1] => lili_256
                [2] => Blond
            )
     
        [2] => Array
            (
                [0] => 2
                [1] => lola_16
            )
     
        [3] => Array
            (
                [0] => 3
                [1] => pat_11
                [2] => Chatain
            )
     
        [4] => Array
            (
                [0] => 4
                [1] => dam_16
            )
    )
    quand il n y a pas de correspondance il ne prends pas par defaut un vide et le glisse dans [2]

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 220
    Points : 28 201
    Points
    28 201
    Par défaut
    Que les choses soient claires, la syntaxe que tu as utilisée avec le where est tout à fait correcte pour faire des jointures, même si personnellement je la qualifie de "sale". C'est une syntaxe qui est plus ancienne, qui devrait, à mon avis, être abandonnée depuis longtemps.

    Pourquoi je ne l'aime pas :

    • Tout d'abords parce que la jointure n'apparait pas clairement. Si une requete comme la tienne, la jointure est encore visible et compréhensive, mais sur des requêtes plus complexes on arrive facilement à perdre le fil.
    • On utilise la clause WHERE pour paramétrer la jointure. Or la clause WHERE sert à la base à filtrer les résultats. On mélange donc 2 choses totalement différentes dans la même clause et, qui plus est, avec la même syntaxe. Avec des requêtes de plusieurs 10ènes de lignes, on mélange facilement les filtres et les jointures dans la clause WHERE et on ne comprend plus rien à la requete
    • Comme la jointure est moins clairement visible, on en oublie facilement le fait que se sont des jointures internes. Et en cas de problème, on se retrouve facilement à rechercher pourquoi il manque des enregistrements sans penser à la jointure.

    Personnellement, je préfère la seconde méthode, plus stricte, plus explicite, plus "propre" à mon goût. Pourquoi :

    • La jointure est clairement identifiée avec le mot clé JOIN et ses qualificateurs.
    • On est pas seulement limité à des jointures internes, les possibilité sont plus grandes
    • Il est possible (et plus facile) d'utiliser des alias pour ne pas avoir à se trainer des nom de tables partout
    • Surtout, on paramètre la jointure dans la jointure elle-même avec le mot clé ON, et on ne vient pas polluer la clause WHERE qui, elle, reste réservée aux filtres sur le résultat.

    Tout cela n'est que mon avis qui n'engage que moi !


    Pour les tutoriaux et cours, tu en trouvera plein ici et notamment celui-ci, extrait d'un cours plus complet, qui est la partie portant sur les jointures précisément :
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut reponse
    Merci je vais lire.

  7. #7
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 220
    Points : 28 201
    Points
    28 201
    Par défaut
    Demande rapide

    quel method avec join il faut employer pour avoir ceci

    quand il n y a pas de correspondance il ne prends pas par defaut un vide et le glisse dans [2]
    Ta requete te renverra toujours 3 colonnes, c'est à toi à vérifier, dans ton code, si ta valeur est vide ou si elle est renseignée au moment de remplir ton tableau.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut rep
    Ah oui c'est il mettre Null

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Une Requête pour interroger deux table en sql
    Par Debutant10 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/07/2012, 19h59
  2. [MySQL] Comment lier deux tables sql
    Par orphen dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 29/09/2010, 21h05
  3. Problème pour lier deux tables
    Par balabonov dans le forum Access
    Réponses: 8
    Dernier message: 21/12/2005, 13h13
  4. lier deux tables a partir dun calcul!!
    Par marie10 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/04/2004, 09h44
  5. comment lier deux tables?????
    Par baboune dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/03/2004, 14h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo