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

 MySQL Discussion :

Requête à travers une table intermédiaire


Sujet :

MySQL

  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 Requête à travers une table intermédiaire
    Bonjour,

    j'essaye d'effectuer un requête "basique" sur 3 tables dont 1 intermédiaire.
    C'est un cas d'école mais je n'y arrive pas...

    J'ai donc une table t_personne, une table t_etablissement et une table intermédiaire t_appartenance, sachant que t_appartenance permet de gérer les personnes ayant (0,n) établissements.

    Voici ma base de données :
    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
    CREATE TABLE `t_etablissement` (
      `id_etablissement` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
      `nom` VARCHAR(100) NOT NULL,
      `adresse` VARCHAR(255) NOT NULL,
      `id_ville` SMALLINT(5) UNSIGNED NOT NULL,
      `tel` VARCHAR(10) NOT NULL,
      `fax` VARCHAR(10) NOT NULL,
      `email` VARCHAR(255) NOT NULL,
      `id_groupe` SMALLINT(5) UNSIGNED,
      PRIMARY KEY (`id_etablissement`),
      INDEX (`nom`),
      FOREIGN KEY (`id_groupe`) REFERENCES `t_groupe` (`id_groupe`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      FOREIGN KEY (`id_ville`) REFERENCES `t_ville` (`id_ville`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    CREATE TABLE `t_personne` (
      `id_personne` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
      `civilite` ENUM("","Mr","Mme","Mlle") NOT NULL,
      `nom` VARCHAR(255) NOT NULL,
      `prenom` VARCHAR(255) NOT NULL,
      `statut` VARCHAR(255) NOT NULL,
      `tel` VARCHAR(10) NOT NULL,
      `fax` VARCHAR(10) NOT NULL,
      `portable` VARCHAR(10) NOT NULL,
      `email` VARCHAR(255) NOT NULL,
      PRIMARY KEY  (`id_personne`),
      KEY (`nom`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    CREATE TABLE `t_appartenance` (
      `id_personne` SMALLINT(5) UNSIGNED NOT NULL,
      `id_etablissement` SMALLINT(5) UNSIGNED NOT NULL,
      PRIMARY KEY  (`id_personne`, `id_etablissement`),
      FOREIGN KEY (`id_personne`) REFERENCES `t_personne` (`id_personne`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      FOREIGN KEY (`id_etablissement`) REFERENCES `t_etablissement` (`id_etablissement`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    et voici ma requête actuelle :
    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
    SELECT
    	G.id_groupe AS g_id,
    	G.nom AS g_nom,
     
     	E.id_etablissement AS e_id,
    	E.nom AS e_nom,
    	E.adresse AS e_adresse,
     
    	P.id_personne AS p_id,
    	P.civilite AS p_civilite,
    	P.nom AS p_nom,
    	P.prenom AS p_prenom
    FROM
    	t_etablissement E
    		LEFT OUTER JOIN t_groupe G ON G.id_groupe = E.id_groupe
    		INNER JOIN t_ville V ON V.id_ville = E.id_ville,
    	t_appartenance A,
    	t_personne P
    WHERE
    	E.id_etablissement = 3
    ORDER BY
        G.nom ASC,
        E.nom ASC;
    Merci d'avance...

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    ... de rien.

    Et le problème est ?...

  3. #3
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Re,

    @Tchupacabra : Tu as donc verrouillé ton dernier post trop, vite !

    Qu'est-ce qui ne va plus dans ta requête ?


  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    il semble déjà manqué des conditions de jointures

  5. #5
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Salut @Cybher,

    En effet tu as raison, j'étais resté sur la requête du dernier post de @Tchupacabra ici.

    @Tchupacabra: Si tu dois utiliser encore d'autres tables, mais les tout de suite.
    Cela évitera des posts multiples comme c'est le cas...

    @+

  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
    Citation Envoyé par Scorpi0 Voir le message
    ... de rien.
    ...tout le plaisir était pour moi.

    Citation Envoyé par Chtulus Voir le message
    @Tchupacabra: Si tu dois utiliser encore d'autres tables, mais les tout de suite.
    Cela évitera des posts multiples comme c'est le cas...
    ouais je m'en doutais un peu mais je ne souhaitais pas en mettre trop pour éviter les confusions... et du coup, j'en ai oublié ma question !

    voici ma base complète avec un jeu d'enregistrements 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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    CREATE TABLE `t_ville` (
      `id_ville` SMALLINT(5) UNSIGNED NOT NULL auto_increment,
      `cp` VARCHAR(5) NOT NULL,
      `nom` VARCHAR(255) NOT NULL,
      PRIMARY KEY (`id_ville`),
      UNIQUE KEY (`nom`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    INSERT INTO `t_ville` (`id_ville`, `cp`, `nom`) VALUES
    (1, "72000", "Le Mans"),
    (2, "68130", "Altkirch"),
    (3, "61000", "Alençon"),
    (4, "50470", "La Glacerie"),
    (5, "72190", "Coulaines"),
    (6, "68640", "Riespach"),
    (7, "75016", "Paris"),
    (8, "72190", "Sargé-lès-le-Mans"),
    (9, "92170", "Vanves");
     
    CREATE TABLE `t_groupe` (
      `id_groupe` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
      `nom` VARCHAR(100) NOT NULL,
      PRIMARY KEY (`id_groupe`),
      UNIQUE KEY (`nom`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    INSERT INTO `t_groupe` (`id_groupe`, `nom`) VALUES
    (1, "Groupe 1"),
    (2, "Groupe 2"),
    (3, "Groupe 3"),
    (4, "Groupe 4");
     
    CREATE TABLE `t_etablissement` (
      `id_etablissement` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
      `nom` VARCHAR(100) NOT NULL,
      `adresse` VARCHAR(255) NOT NULL,
      `id_ville` SMALLINT(5) UNSIGNED NOT NULL,
      `tel` VARCHAR(10) NOT NULL,
      `fax` VARCHAR(10) NOT NULL,
      `email` VARCHAR(255) NOT NULL,
      `id_groupe` SMALLINT(5) UNSIGNED,
      PRIMARY KEY (`id_etablissement`),
      INDEX (`nom`),
      FOREIGN KEY (`id_groupe`) REFERENCES `t_groupe` (`id_groupe`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      FOREIGN KEY (`id_ville`) REFERENCES `t_ville` (`id_ville`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    INSERT INTO `t_etablissement` (`id_etablissement`, `id_groupe`, `nom`, `adresse`, `id_ville`, `tel`, `fax`, `email`) VALUES
    (1, NULL, "Etablissement 1 sans groupe", "31, rue Diderot", 8, "0102030405", "0102030405", "mail@mail.fr"),
    (2, 1, "Etablissement 2 - groupe 1", "Rue Henri Cornat", 2, "0102030405", "0102030405", "mail@mail.fr"),
    (3, 2, "Etablissement 3 - groupe 2", "ZI Quartier Plessier", 3, "0102030405", "0102030405", "mail@mail.fr"),
    (4, 2, "Etablissement 4 - groupe 2", "48, rue 3ème Zouave", 3, "0102030405", "0102030405", "mail@mail.fr"),
    (5, 2, "Etablissement 5 - groupe 2", "90, route de Feret", 7, "0102030405", "0102030405", "mail@mail.fr"),
    (6, 2, "Etablissement 6 - groupe 2", "90, route de Feret", 7, "0102030405", "0102030405", "mail@mail.fr"),
    (7, 2, "Etablissement 7 - groupe 2", "90, route de Feret", 7, "0102030405", "0102030405", "mail@mail.fr"),
    (8, 2, "Etablissement 8 - groupe 2", "rue de Paris", 3, "0102030405", "0102030405", "mail@mail.fr"),
    (9, 3, "Etablissement 9 - groupe 3", "12, rue du 18 juin 1940 - BP 21", 2, "0102030405", "0102030405", "mail@mail.fr"),
    (10, 4, "Etablissement 10 - groupe 4", "24, rue de la Paix", 5, "0102030405", "0102030405", "mail@mail.fr"),
    (11, 4, "Etablissement 11 - groupe 4", "Rue du Ponceau", 5, "0102030405", "0102030405", "mail@mail.fr"),
    (12, NULL, "Etablissement 12 sans groupe", "17, rue de Priori", 4, "0102030405", "0102030405", "mail@mail.fr"),
    (13, NULL, "Etablissement 13 sans groupe", "6, rue Eugene Manuel", 9, "0102030405", "0102030405", "mail@mail.fr"),
    (14, 2, "Etablissement 14 - groupe 2", "ZI Quartier Plessier", 3, "0102030405", "0102030405", "mail@mail.fr"),
    (15, 2, "Etablissement 15 - groupe 2", "ZI Quartier Plessier", 3, "0102030405", "0102030405", "mail@mail.fr");
     
    CREATE TABLE `t_personne` (
      `id_personne` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
      `civilite` ENUM("","Mr","Mme","Mlle") NOT NULL,
      `nom` VARCHAR(255) NOT NULL,
      `prenom` VARCHAR(255) NOT NULL,
      `tel` VARCHAR(10) NOT NULL,
      `fax` VARCHAR(10) NOT NULL,
      `portable` VARCHAR(10) NOT NULL,
      `email` VARCHAR(255) NOT NULL,
      PRIMARY KEY  (`id_personne`),
     
     
     
     
      KEY (`nom`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    INSERT INTO `t_personne` (`id_personne`, `civilite`, `nom`, `prenom`, `tel`, `fax`, `portable`, `email`)
    VALUES 
    (1, "Mr", "AAAAA", "aaaaaaaa", "", "", "0606060606", "directeur.general@mariepire.asso.fr"), 
    (2, "Mr", "BBBB", "bbbbbbb", "0606060606", "0606060606", "0606060606", ""),
    (3, "Mme", "CCCCCCC", "ccccccccccc", "", "", "0606060606", "sdsds@wanadoo.fr"),
    (4, "Mme", "DDDDDDD", "ddd", "", "", "", ""),
    (5, "Mr", "EEEEEEE", "", "", "", "", ""),
    (6, "Mr", "FFF", "ffff", "", "", "", ""),
    (7, "Mlle", "GGGG", "gggggg", "", "", "", "sdsds@wanadoo.fr"),
    (8, "Mr", "HHHH", "hhhhhhhhhhhhhh", "0606060606", "", "", "sdsds@wanadoo.fr"),
    (9, "Mr", "II", "iiiiiiii", "0606060606", "", "", "sdsds@wanadoo.fr"),
    (10, "Mr", "JJJJJ", "jjjjjjjjjjj", "", "", "", "sdsds@wanadoo.fr");
     
    CREATE TABLE `t_appartenance` (
      `id_personne` SMALLINT(5) UNSIGNED NOT NULL,
      `id_etablissement` SMALLINT(5) UNSIGNED NOT NULL,
      PRIMARY KEY  (`id_personne`, `id_etablissement`),
      FOREIGN KEY (`id_personne`) REFERENCES `t_personne` (`id_personne`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      FOREIGN KEY (`id_etablissement`) REFERENCES `t_etablissement` (`id_etablissement`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    INSERT INTO `t_appartenance` (`id_personne`, `id_etablissement`)
    VALUES 
    (1, 3), 
    (2, 9),
    (2, 13),
    (3, 9),
    (4, 10),
    (5, 11),
    (7, 3),
    (8, 5),
    (9, 4),
    (9, 14),
    (9, 15),
    (10, 14);
    J'aimerais donc avoir toutes les infos concernant un établissement de la manière suivante.

    ¤ avec établissement n°3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +----------+-----------+------------------+----------------------------+---------+-----------------------+-------------+----------+--------------+-----------------+
    |id_groupe |nom_groupe | id_etablissement |       nom_etablissement    |  ville  | adresse_etablissement | id_personne | civilite | nom_personne | prenom_personne |
    +----------+-----------+------------------+----------------------------+---------+-----------------------+-------------+----------+--------------+-----------------+
    |     2    | Groupe 2  |         3        | Etablissement 3 - groupe 2 | Alençon | ZI Quartier Plessier  |      1      |    Mr    |     AAAAA    |    aaaaaaaa     |
    |     2    | Groupe 2  |         3        | Etablissement 3 - groupe 2 | Alençon | ZI Quartier Plessier  |      7      |   Mlle   |     GGGG     |     gggggg      |
    +----------+-----------+------------------+----------------------------+---------+-----------------------+-------------+----------+--------------+-----------------+
    ¤ avec l'établissement n°12 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    +----------+-----------+------------------+------------------------------+-------------+----------------------+-------------+----------+--------------+-----------------+
    |id_groupe |nom_groupe | id_etablissement |       nom_etablissement      |    ville    |adresse_etablissement | id_personne | civilite | nom_personne | prenom_personne |
    +----------+-----------+------------------+------------------------------+-------------+----------------------+-------------+----------+--------------+-----------------+
    |   NULL   |   NULL    |        12        | Etablissement 12 sans groupe | La Glacerie |  17, rue de Priori   |    NULL     |   NULL   |     NULL     |    NULL         |
    +----------+-----------+------------------+------------------------------+-------------+----------------------+-------------+----------+--------------+-----------------+
    Avec la requête suivante, il me manque les personnes (s'il y en a)...
    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
    SELECT
    	G.id_groupe AS g_id,
    	G.nom AS g_nom,
     
     	E.id_etablissement AS e_id,
    	E.nom AS e_nom,
    	V.nom AS e_ville,
    	E.adresse AS e_adresse
    FROM
    	t_etablissement E
    		LEFT OUTER JOIN t_groupe G ON G.id_groupe = E.id_groupe
    		INNER JOIN t_ville V ON V.id_ville = E.id_ville
    WHERE
    	E.id_etablissement = 3
    ORDER BY
        G.nom ASC,
        E.nom ASC;
    Il me manque donc une ou deux jointures...
    Mais lesquelles ?

  7. #7
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Re,

    Je penche pour 2 car si tu poses le problème :
    -Une personne "appartient" à un établissement !!! Non ?
    Tes tables forment la relation, donc !!! Non ?


  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
    bah non justement, une personne a (0,n) établissements...

    ma prochaine requête devra récupérer les infos d'un établissement (s'il y a) associé à une personne à partir d'une clause équivalente à : nom_personne LIKE '%chaine%'

    Le but est d'élaborer une moteur de recherche d'un annuaire... avec un formulaire comportant un champ texte "nom de l'établissement" et un champ "nom de la personne" (HTML+javascript+PHP+MySQL)

  9. #9
    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
    bon, j'en approche...

    Avec :
    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
    SELECT
    	G.id_groupe AS g_id,
    	G.nom AS g_nom,
     
    	E.id_etablissement AS e_id,
    	E.nom AS e_nom,
    	E.adresse AS e_adresse,
    	V.cp AS e_cp,
    	V.nom AS e_ville,
     
    	A.id_personne AS a_id_personne
    FROM
    	t_etablissement E
            LEFT OUTER JOIN t_groupe G ON G.id_groupe = E.id_groupe
            INNER JOIN t_ville V ON V.id_ville = E.id_ville
            LEFT OUTER JOIN t_appartenance A ON A.id_etablissement = E.id_etablissement
    WHERE
    	E.id_etablissement = 3
    ORDER BY
        G.nom ASC,
        E.nom ASC;
    j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +----------+-----------+------------------+----------------------------+---------+-----------------------+---------------+
    |id_groupe |nom_groupe | id_etablissement |       nom_etablissement    |  ville  | adresse_etablissement | a_id_personne |
    +----------+-----------+------------------+----------------------------+---------+-----------------------+---------------+
    |     2    | Groupe 2  |         3        | Etablissement 3 - groupe 2 | Alençon | ZI Quartier Plessier  |        1      |
    |     2    | Groupe 2  |         3        | Etablissement 3 - groupe 2 | Alençon | ZI Quartier Plessier  |        7      |
    +----------+-----------+------------------+----------------------------+---------+-----------------------+---------------+
    Je récupère bien les identifiants des personnes, il me manque plus que la dernière jointure à t_personne pour avoir les infos (nom, prénom, etc...) !

    Allez SVP, un dernier coup de pouce...

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Salut,

    La réponse est dans ton post :
    il me manque plus que la dernière jointure à t_personne
    Quelle syntaxe as tu essayé? Qu'est ce qui ne marche pas?

  11. #11
    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
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    SELECT
    	G.id_groupe AS g_id,
    	G.nom AS g_nom,
     
    	E.id_etablissement AS e_id,
    	E.nom AS e_nom,
    	E.adresse AS e_adresse,
    	V.cp AS e_cp,
    	V.nom AS e_ville,
     
    	P.id_personne AS p_id,
    	P.civilite AS p_civilite,
    	P.nom AS p_nom,
    	P.prenom AS p_prenom
    FROM
    	t_etablissement E
    		LEFT OUTER JOIN t_groupe G ON G.id_groupe = E.id_groupe
    		INNER JOIN t_ville V ON V.id_ville = E.id_ville
    		LEFT OUTER JOIN t_appartenance A ON A.id_etablissement = E.id_etablissement,
    	t_personne P
    WHERE
    	E.id_etablissement = 3
    ORDER BY
        G.nom ASC,
        E.nom ASC;
    En fait, je ne sais pas utiliser 2 fois t_appartenance pour la liaison vers t_etablissement et la liaison vers t_personne.

  12. #12
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Je pense que tu devrais lire cela!

    - Les jointures !
    - Jointures manquantes !

    Merci SQLpro !


  13. #13
    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 connaissais le premier lien, c'est grâce à lui que j'ai utilisé le LEFT OUTER et INNER JOIN.

    Cependant, je suis largué pour appliquer les exemples à mon cas...
    Un indice ?

  14. #14
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Si je résume, il y a quatre tables plus une table de relations, 'Appartenances' , entre les 'Personnes' et les 'Etablissements'.
    Un établissement est forcément situé dans une ville et une seule (INNER JOIN)
    Il appartient forcément à un groupe et un seul.(alors pourquoi LEFT JOIN ?)
    Une personne peut appartenir à aucun ou un à plusieurs établissements (LEFT JOIN avec 'Appartenances')
    Un établissement peut n'avoir aucune, une ou plusieurs personnes rattachées (LEFT JOIN avec 'Appartenances')

  15. #15
    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
    Citation Envoyé par Maljuna Kris Voir le message
    Saluton,
    Si je résume, il y a quatre tables plus une table de relations, 'Appartenances' , entre les 'Personnes' et les 'Etablissements'.
    Un établissement est forcément situé dans une ville et une seule (INNER JOIN)
    > OUI
    Il appartient forcément à un groupe et un seul.(alors pourquoi LEFT JOIN ?)
    > NON, un établissement n'a pas forcément de groupe.
    Une personne peut appartenir à aucun ou un à plusieurs établissements (LEFT JOIN avec 'Appartenances')
    > OUI
    Un établissement peut n'avoir aucune, une ou plusieurs personnes rattachées (LEFT JOIN avec 'Appartenances')
    > OUI

  16. #16
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Bon, mais un établissement ne peut pas appartenir à plusieurs groupes je présume (donc LEFT JOIN)
    Bref, où est le problème pour faire les jointures ?

  17. #17
    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
    oui un établissement 0 ou 1 groupe...

    bah le problème est que j'ai testé pleins de requêtes avec des jointures de tous types, et à chaque fois, j'obtenais des résultats faux, genre pour un même établissement, tous les personnes enregistrés y été liées.


  18. #18
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Je ne comprends pas.
    J'ai exécuté la requête de dump de ta base.
    Et j'ai lancé cette requête toute simple
    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
    SELECT G.id_groupe AS g_id,
               G.nom AS g_nom, 
               E.id_etablissement AS e_id, 
               E.nom AS e_nom, 
               V.nom AS e_ville, 
               E.adresse AS e_adresse, 
               P.civilite, 
               P.nom, 
               P.prenom
    FROM t_etablissement E
            LEFT JOIN t_groupe G ON G.id_groupe = E.id_groupe
            INNER JOIN t_ville V ON V.id_ville = E.id_ville
            LEFT JOIN t_appartenance A ON A.id_etablissement = E.id_etablissement
             LEFT JOIN t_personne P ON P.id_personne = A.id_personne
    WHERE E.id_etablissement =3
    ORDER BY G.nom ASC , E.nom ASC
    et j'ai obtenu ce résultat :
    g_id g_nom e_id e_nom e_ville e_adresse civilite nom prenom
    2 Groupe 2 3 Etablissement 3 - groupe 2 Alençon ZI Quartier Plessier Mr AAAAA aaaaaaaa
    2 Groupe 2 3 Etablissement 3 - groupe 2 Alençon ZI Quartier Plessier Mlle GGGG gggggg

  19. #19
    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
    merci beaucoup Maljuna Kris, ta requête semble la bonne ! (et merci aux autres pour leur aide)

    Cependant, je ne comprends pas pourquoi ni comment il y a jointure entre 2 tables qui ne se touchent pas : t_personne et t_etablissement
    Si quelqu'un pouvait m'expliquer, ça serait que du bonus... parce que dans les tutos dispos, je ne crois pas avoir vu ce cas de figure.

    @+

  20. #20
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Citation Envoyé par Tchupacabra Voir le message
    merci beaucoup Maljuna Kris, ta requête semble la bonne ! (et merci aux autres pour leur aide)

    Cependant, je ne comprends pas pourquoi ni comment il y a jointure entre 2 tables qui ne se touchent pas : t_personne et t_etablissement
    Si quelqu'un pouvait m'expliquer, ça serait que du bonus... parce que dans les tutos dispos, je ne crois pas avoir vu ce cas de figure.

    @+
    Je ne suis pas sûr de savoir ce que voudrait dire "deux tables qui se touchent"...

    Mais l'idée générale est que tu peux utiliser n'importe quelle condition pour faire ce que tu veux comme jointure.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/06/2009, 23h14
  2. Résultat requête dans une table
    Par guiguikawa dans le forum Requêtes et SQL.
    Réponses: 22
    Dernier message: 23/06/2006, 15h34
  3. passer une valeur d'une requête a une table
    Par LesLemmings dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/06/2006, 14h13
  4. Réponses: 2
    Dernier message: 02/06/2006, 11h26
  5. Réponses: 13
    Dernier message: 14/09/2005, 16h21

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