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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    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 : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    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 ?

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    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 : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    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...

    @+
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    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 ?

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