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 :

Ma requête avec jointures n'affiche pas tout


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut Ma requête avec jointures n'affiche pas tout
    Bonjour à tous,

    j'ai un souci avec la création d'un requête sur plusieurs tables.
    Apparemment, c'est au dessus de mes compétences, je m'en remet donc à ce cher forum...

    Actuellement, j'arrive à récupérer toutes les inscriptions des membres (avec ma requête ci-dessous).
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    id 	login 	email 	id_e 	nom_e
    5 	123456 	123456@123456.fr 	1 	abricot
    6 	123456 	123456@123456.fr 	2 	absinthe
    7 	123456 	123456@123456.fr 	3 	amande
    8 	123456 	123456@123456.fr 	4 	améthyste
    9 	a 	ficht@club.fr 	2 	absinthe
    10 	a 	ficht@club.fr 	9 	avocat
    1 	xxxx 	xxxx@xxxx.fr 	1 	abricot
    2 	xxxx 	xxxx@xxxx.fr 	5 	anis
    3 	xxxx 	xxxx@xxxx.fr 	6 	argile
    4 	xxxx 	xxxx@xxxx.fr 	10 	azur
    Mais j'aimerais récupérer également tous les membres n'ayant pas inscription (dans mon exemple : le membre 'abcd').

    Voici mes tables tests :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    -- T_ETABLISSEMENT
     
    CREATE TABLE `t_etablissement` (
      `id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
      `nom` VARCHAR(100),
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    INSERT INTO `t_etablissement` (`id`, `nom`) VALUES
    (1, "abricot"),
    (2, "absinthe"),
    (3, "amande"),
    (4, "améthyste"),
    (5, "anis"),
    (6, "argile"),
    (7, "arzel"),
    (8, "aubergine"),
    (9, "avocat"),
    (10, "azur");
     
    -- T_MEMBRE
     
    CREATE TABLE `t_membre` (
      `login` VARCHAR(20) NOT NULL,
      `email` VARCHAR(255) NOT NULL,
      PRIMARY KEY (`login`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    INSERT INTO `t_membre` (`login`, `email`) VALUES
    ('xxxx', 'xxxx@xxxx.fr'),
    ('123456', '123456@123456.fr'),
    ('a', 'ficht@club.fr'),
    ('abcd', 'abcd@abcd.fr');
     
    -- T_INSCRIPTION
     
    CREATE TABLE `t_inscription` (
      `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
      `login` VARCHAR(20) NOT NULL,
      `etablissement_id` TINYINT UNSIGNED NOT NULL,
      PRIMARY KEY (`id`),
      FOREIGN KEY (`login`) REFERENCES `t_membre` (`login`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      FOREIGN KEY (`etablissement_id`) REFERENCES `t_etablissement` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    INSERT INTO `t_inscription` (`id`, `login`, `etablissement_id`) VALUES
    (1, 'xxxx', 1),
    (2, 'xxxx', 5),
    (3, 'xxxx', 6),
    (4, 'xxxx', 10),
    (5, '123456', 1),
    (6, '123456', 2),
    (7, '123456', 3),
    (8, '123456', 4),
    (9, 'a', 2),
    (10, 'a', 9);
     
    -- REQUETE
     
    SELECT I.id, M.login, M.email, E.id AS id_e, E.nom AS nom_e
    FROM t_inscription AS I
    INNER JOIN t_membre AS M ON M.login = I.login
    INNER JOIN t_etablissement AS E ON E.id = I.etablissement_id
    ORDER BY login ASC, id_e ASC;
    Quelqu'un aurait-il la gentillesse de me dire ce qu'il faut modifier dans ma requête ?
    Merci d'avance...

    @ bientôt

  2. #2
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 54
    Points
    54
    Par défaut
    Salut !
    je pense qu'a la place de inner join il faut mettre right join car tu veut tous ceux de membre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT I.id, M.login, M.email, E.id AS id_e, E.nom AS nom_e
    FROM t_inscription AS I
    RIGHT JOIN t_membre AS M ON M.login = I.login
    INNER JOIN t_etablissement AS E ON E.id = I.etablissement_id
    ORDER BY login ASC, id_e ASC;
    Test si tu peux.
    Voilà


  3. #3
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Je viens de tester.. malheureusement cela ne change rien.

  4. #4
    Membre averti Avatar de icsor
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2008
    Messages : 258
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    déjà pour les jointure, je te conseille de lire ceci et plus précisement ici, j'utiliserai outer join au lieu du premier inner join.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 54
    Points
    54
    Par défaut
    Re !

    Alors la page de "icsor" ta aidé ?
    J'ai regardé normalement dans ce qu'il t'a donné, il y a tout !

  6. #6
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT I.id, M.login, M.email, E.id AS id_e, E.nom AS nom_e
    FROM t_membre M
    LEFT OUTER JOIN t_inscription AS I ON M.login = I.login
    LEFT OUTER JOIN t_etablissement AS E ON E.id = I.etablissement_id
    ORDER BY login ASC, id_e ASC;
    donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    id 	login 	email 	id_e 	nom_e
    5 	123456 	123456@123456.fr 	1 	abricot
    6 	123456 	123456@123456.fr 	2 	absinthe
    7 	123456 	123456@123456.fr 	3 	amande
    8 	123456 	123456@123456.fr 	4 	améthyste
    9 	a 	ficht@club.fr 	2 	absinthe
    10 	a 	ficht@club.fr 	9 	avocat
    NULL 	abcd 	abcd@abcd.fr 	NULL 	NULL
    1 	xxxx 	xxxx@xxxx.fr 	1 	abricot
    2 	xxxx 	xxxx@xxxx.fr 	5 	anis
    3 	xxxx 	xxxx@xxxx.fr 	6 	argile
    4 	xxxx 	xxxx@xxxx.fr 	10 	azur
    Il fallait donc mettre des LEFT OUTER JOIN partout !!!

    C'est clair que le lien sur les jointures est ENORME ! Je l'avais déjà lu (pas en entier sinon je me serait pendu... )

    @+ et encore merci à vous.

  7. #7
    Membre averti Avatar de icsor
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2008
    Messages : 258
    Points : 436
    Points
    436
    Par défaut
    Du coup, moi j'ai une question (je ne maîtrise pas vraiment les notations inner et outer join, moi je préfére les where avec les (+) ): Ca fait quoi le right join, par rapport au inner join dans le requète de Jedi186?

    (le gars qui a la base viens pour aider et qui finalement demande de l'aide ...)

  8. #8
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT colonnes 
    FROM TGauche RIGHT OUTER JOIN TDroite ON condition de jointure
    On recherche toutes les valeurs satisfaisant la condition de jointure précisée dans prédicat, puis on rajoute toutes les lignes de la table TDroite qui n'ont pas été prises en compte au titre de la satisfaction du critère.

  9. #9
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 54
    Points
    54
    Par défaut
    En fait, INNER JOIN c'est un jointure interne, ça veut dire que tu n'auras dans le résultat final que les lignes qui se correspondent dans les deux tables.

    Alors que pour LEFT JOIN :toutes les lignes de la première table sont incluses dans le résultat de la requête, même s'il n'existe pas de ligne correspondante dans la seconde table et l'inverse pour RIGHT JOIN.

    Tu vois ce que je veux dire ?

  10. #10
    Membre averti Avatar de icsor
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2008
    Messages : 258
    Points : 436
    Points
    436
    Par défaut
    Ok, merci des précisions sur la syntaxe (je connais jointure externe et interne donc c'est bon)

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

Discussions similaires

  1. Requête avec jointure qui retourne null si pas de valeur
    Par jubourbon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/09/2011, 11h10
  2. [AC-97] Une requête étrange qui n'affiche pas toutes les entrées
    Par ZoliveR dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/11/2010, 11h58
  3. Image issue d'une requête SQL ne s'affichent pas toutes
    Par princesse95 dans le forum Langage
    Réponses: 21
    Dernier message: 13/03/2009, 15h22
  4. Réponses: 11
    Dernier message: 15/09/2008, 10h25
  5. Requête de sélection n'affiche pas tout
    Par tojiji dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 03/08/2006, 21h33

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