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 :

3 tables 2 jointures 1 problème


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 3 tables 2 jointures 1 problème
    Bonjour à tous,

    j'essaye de faire une requête portant sur 3 tables (1 principale : t_etablissement et 2 autres : t_ville et t_groupe).

    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
    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;
     
    CREATE TABLE `t_groupe` (
      `id_groupe` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
      `nom` VARCHAR(100) NOT NULL,
      `tags` VARCHAR(255) NOT NULL,
      `memo` TEXT NOT NULL,
      PRIMARY KEY (`id_groupe`),
      UNIQUE KEY (`nom`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    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,
      `site_internet` VARCHAR(255) NOT NULL,
      `tags` VARCHAR(255) NOT NULL,
      `memo` TEXT 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;
    Contexte :
    ¤ Un établissement appartient ou non à un groupe
    ¤ Un établissement se situe forcément dans une ville

    Voici ma requête problématique :
    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,
    	E.tel AS e_tel,
    	E.fax AS e_fax,
    	E.email AS e_email,
    	E.site_internet AS site_internet,
    	E.tags AS e_tags,
    	E.memo AS e_memo
    FROM
    	t_etablissement E LEFT OUTER JOIN t_groupe G ON G.id_groupe = E.id_groupe,
    	t_ville V LEFT OUTER JOIN t_etablissement ON t_etablissement.id_ville = V.id_ville
    WHERE
    	E.id_etablissement = 3
    ORDER BY G.nom ASC, E.nom ASC;
    Au lieu de récupérer un seul enregistrement, celui de l'établissement n°3 avec ses infos (ville + groupe), je récupère plusieurs fois l'établissement avec des villes différentes...

    Vous voyez pourquoi ?
    Merci d'avance.

    @ bientôt

  2. #2
    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
    Bonjour,

    C'est bien du MySQL

    Essai 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
     
    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,
    	E.tel AS e_tel,
    	E.fax AS e_fax,
    	E.email AS e_email,
    	E.site_internet AS site_internet,
    	E.tags AS e_tags,
    	E.memo AS e_memo
    FROM
    	t_etablissement E INNER JOIN t_groupe G 
                                         ON G.id_groupe = E.id_groupe INNER JOIN t_ville V
    	                                                             ON t_etablissement.id_ville = V.id_ville
     
    WHERE
    	E.id_etablissement = 3
     
    ORDER BY G.nom ASC
                , E.nom ASC;
    Je ne suis pas sûr que les LEFT OUTER soient nécessaire ! Par contre, peut-être essayer des parenthèses dans les jointures si il y a un soucis.


  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
    après quelques modifs (LEFT OUTER sur le groupe car NULL possible et utilisation de l'alias E), voici la nouvelle requête qui semble fonctionnelle :
    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,
    	E.tel AS e_tel,
    	E.fax AS e_fax,
    	E.email AS e_email,
    	E.site_internet AS site_internet,
    	E.tags AS e_tags,
    	E.memo AS e_memo
    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
    ORDER BY
        G.nom ASC,
        E.nom ASC;
    Merci beaucoup pour ton aide Chtulus

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

Discussions similaires

  1. Problème pour insertion dans tables avec jointure
    Par C3DRIC49 dans le forum Langage
    Réponses: 8
    Dernier message: 15/10/2010, 22h52
  2. Problème de table de jointure
    Par adrien. dans le forum IHM
    Réponses: 1
    Dernier message: 19/04/2010, 00h04
  3. [AC-2000] Problème avec table de jointure
    Par Brunodm13 dans le forum Modélisation
    Réponses: 2
    Dernier message: 22/07/2009, 19h35
  4. [table de jointure] problème 3201 lors d'enregistrement
    Par Heidie dans le forum Modélisation
    Réponses: 1
    Dernier message: 04/01/2009, 12h57
  5. Réponses: 4
    Dernier message: 29/06/2007, 17h08

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