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 :

Jointures multiples sur une même table


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Jointures multiples sur une même table
    Bonjour à tous,

    Je précise tout d'abord être de niveau débutant en SQL...
    Je conçois actuellement une base de données gérant un championnat de foot. J'ai une table des matchs avec entre autres l'id de l'équipe qui reçoit et l'id de l'équipe qui se déplace. Je dispose également d'une table des clubs. Je souhaite écrire une requête qui liste l'intégralité des matchs, en allant chercher le nom du club qui reçoit et le nom du club qui se déplace dans la table des clubs. J'ai beau avoir cherché de la documentation sur INNER JOIN, je n'ai pas rencontré ce cas de figure. Ma question est triple :
    Comment utiliser INNER JOIN pour réaliser cette opération ?
    Est-ce qu'une autre instruction est plus adaptée ?
    Mon schéma relationnel est-il moisi ?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 769
    Points : 52 720
    Points
    52 720
    Billets dans le blog
    5
    Par défaut
    Vous avez mal cherché... lisez au moins mon cours !
    http://sqlpro.developpez.com/cours/s...intures/#LIV-C

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Après lecture de votre cours, je ne suis pas convaincu que nous soyons dans le même cas. Vous avez une ligne par chambre, j'ai une ligne par match (donc pour deux équipes). Je ne vois donc pas comment utiliser votre système dans mon exemple. Je cherche uniquement à faire appel à une table de nomenclature deux fois par ligne. Ai-je tort ? N'y a-t-il personne qui puisse me venir en aide ?

  4. #4
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Les cours ne répondront pas EXACTEMENT a votre problématique, mais ils ouvrent des portes pour résoudre des problèmes différents.

    Dans votre cas, pour un match vous avez 2 équipes, donc 2 id d'équipe.
    Pour chaque id vous faites une jointure avec votre table d'équipe et vous avez vos résultats.

    Le INNER JOIN est bien la solution a votre problème.

    SQL n'est pas qu'une simple technique d'écriture a apprendre, il faut comprendre ce que l'on veut et ce que l'on fait.
    Écrivez sur papier avec des mots français ce que vous souhaiter avoir et retranscrivez cela en SQL par la suite.

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Je m'en sors en utilisant une requête imbriquée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT r.ville_club AS dom, clubs_tb.ville_club AS ext
    FROM (SELECT clubs_tb.ville_club, matchs_tb.id_club_ext
    FROM matchs_tb
    INNER JOIN clubs_tb ON ( matchs_tb.id_club_dom = clubs_tb.id_club )
    ) AS r
    INNER JOIN clubs_tb ON ( r.id_club_ext = clubs_tb.id_club )
    Si quelqu'un pense que cette manip est possible en une seule requête, je suis preneur.
    Merci

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT dom.ville_club AS dom, ext.ville_club AS ext
    FROM matchs_tb match
    INNER JOIN clubs_tb dom
    ON match.id_club_dom = dom.id_club 
    INNER JOIN clubs_tb ext 
    ON  match.id_club_ext = ext.id_club )
    A+

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Je ne comprends pas votre code. Je dispose de deux tables matchs_tb et clubs_tb (c'est cette dernière qui sert à ramener le nom des clubs). Pouvez-vous traduire votre code en utilisant cette nomenclature ?
    Merci

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 769
    Points : 52 720
    Points
    52 720
    Billets dans le blog
    5
    Par défaut
    Dans ce cas merci de respecter la charte de postage en posant le DDL de vos tables (CREATE TABLE ...) ainsi qu'un jeu d'essais sous forme INSERT ...
    A lire : http://www.developpez.net/forums/a69...gage-sql-lire/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour
    Le code de teach utilisent les mêmes noms de tables que toi.
    Peut-être que tu ne comprends pas la notion d'alias.
    Quand teach écrit
    matchs_tb match
    , il dit au SGBD j'utilise la table "matchs_tb" mais je vais l'appeler "match". C'est comme toi avec ta sous requête, que tu as nommé r par
    AS r
    Le mot clé AS est optionnel.

    Et le plus intéressant dans la technique c'est quand il écrit
    clubs_tb dom
    ce qui indique au SGBD utilise la table clubs_tbet et moi je l'appelerai "dom". De cette façon on peut utiliser plusieurs fois une même table dans un select.
    d'où le
    clubs_tb ext
    Pour moi le seul problème avec la requête de teach est qu'il y a une parenthèse fermante en trop.
    Je la réécris ci-dessous, sans la parenthèse et en utilisant le mot clé AS pour le cas où cela te permettrait de mieux la comprendre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT dom.ville_club AS dom, 
    	ext.ville_club AS ext
    FROM matchs_tb AS match
    INNER JOIN clubs_tb AS dom
    	ON match.id_club_dom = dom.id_club 
    INNER JOIN clubs_tb AS ext 
    	ON  match.id_club_ext = ext.id_club
    Est ce plus clair?
    A+
    Soazig

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Voici la structure de mes tables :
    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
     
    CREATE TABLE `clubs_tb` (
      `id_club` smallint(5) unsigned NOT NULL auto_increment,
      `nom_club` varchar(80) NOT NULL,
      `ab_club` varchar(6) NOT NULL,
      `ville_club` varchar(40) NOT NULL,
      PRIMARY KEY  (`id_club`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=25 ;
     
    --
    -- Contenu de la table `clubs_tb`
    --
     
    INSERT INTO `clubs_tb` VALUES(1, 'association de la jeunesse auxerroise', 'AJA', 'auxerre');
    INSERT INTO `clubs_tb` VALUES(2, 'football club des girondins de bordeaux', 'FCGB', 'bordeaux');
    INSERT INTO `clubs_tb` VALUES(3, 'stade malherbe caen calvados basse-normandie', 'SMC', 'caen');
    INSERT INTO `clubs_tb` VALUES(4, 'grenoble foot 38', 'GF38', 'grenoble');
    INSERT INTO `clubs_tb` VALUES(5, 'le havre athletic club football', 'HAC', 'le havre');
    INSERT INTO `clubs_tb` VALUES(6, 'le mans union club 72', 'MUC72', 'le mans');
    INSERT INTO `clubs_tb` VALUES(7, 'lille olympique sporting club lille metropole', 'LOSC', 'lille');
    INSERT INTO `clubs_tb` VALUES(8, 'football club lorient-bretagne sud', 'FCL', 'lorient');
    INSERT INTO `clubs_tb` VALUES(9, 'olympique lyonnais', 'OL', 'lyon');
    INSERT INTO `clubs_tb` VALUES(10, 'olympique de marseille', 'OM', 'marseille');
    INSERT INTO `clubs_tb` VALUES(11, 'association sportive de monaco football', 'ASM', 'monaco');
    INSERT INTO `clubs_tb` VALUES(12, 'association sportive nancy-lorraine', 'ASNL', 'nancy');
    INSERT INTO `clubs_tb` VALUES(13, 'football club de nantes', 'FCNA', 'nantes');
    INSERT INTO `clubs_tb` VALUES(14, 'olympique gymnaste club nice cote d azur', 'OGCN', 'nice');
    INSERT INTO `clubs_tb` VALUES(15, 'paris-saint-germain football club', 'PSG', 'paris');
    INSERT INTO `clubs_tb` VALUES(16, 'stade rennais football club', 'SR', 'rennes');
    INSERT INTO `clubs_tb` VALUES(17, 'association sportive de saint-etienne loire', 'ASSE', 'st-etienne');
    INSERT INTO `clubs_tb` VALUES(18, 'football club de sochaux-montbeliard', 'FCSM', 'sochaux');
    INSERT INTO `clubs_tb` VALUES(19, 'toulouse football club', 'TFC', 'toulouse');
    INSERT INTO `clubs_tb` VALUES(20, 'valenciennes football club', 'VA', 'valenciennes');
    INSERT INTO `clubs_tb` VALUES(24, 'racing club de lens', 'RCL', 'lens');
    INSERT INTO `clubs_tb` VALUES(23, 'football club de metz', 'FCM', 'metz');
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `matchs_tb`
    --
     
    CREATE TABLE `matchs_tb` (
      `id_match` smallint(5) unsigned NOT NULL auto_increment,
      `buts_dom` tinyint(2) unsigned NOT NULL,
      `buts_ext` tinyint(2) unsigned NOT NULL,
      `journee` tinyint(2) unsigned NOT NULL,
      `id_club_dom` smallint(5) unsigned NOT NULL,
      `id_club_ext` smallint(5) unsigned NOT NULL,
      `id_saison` tinyint(3) unsigned NOT NULL,
      PRIMARY KEY  (`id_match`),
      KEY `id_club_dom` (`id_club_dom`,`id_club_ext`,`id_saison`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=374 ;
     
    --
    -- Contenu de la table `matchs_tb`
    --
     
    INSERT INTO `matchs_tb` VALUES(1, 4, 4, 1, 16, 10, 1);
    INSERT INTO `matchs_tb` VALUES(2, 0, 1, 1, 6, 8, 1);
    INSERT INTO `matchs_tb` VALUES(3, 2, 1, 1, 1, 13, 1);
    INSERT INTO `matchs_tb` VALUES(4, 1, 0, 1, 11, 15, 1);
    INSERT INTO `matchs_tb` VALUES(5, 1, 0, 1, 20, 17, 1);
    INSERT INTO `matchs_tb` VALUES(6, 2, 1, 1, 2, 3, 1);
    INSERT INTO `matchs_tb` VALUES(9, 0, 0, 1, 12, 7, 1);
    INSERT INTO `matchs_tb` VALUES(10, 1, 0, 1, 5, 14, 1);
    Quelqu'un m'a dit comment faire ce que je veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * 
    FROM matchs_tb
    INNER JOIN clubs_tb AS dom
    ON (matchs_tb.id_club_dom=dom.id_club)
    INNER JOIN clubs_tb AS ext
    ON (matchs_tb.id_club_ext=ext.id_club)
    J'aurais dû préciser plus tôt la structure de mes tables. Je retiens pour la prochaine fois. Merci quand même.

  11. #11
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Ha ben, même pas besoin de demander pour avoir la réponse !

    Merci !

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

Discussions similaires

  1. Numérotation multiple sur une même table
    Par krysmareen dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/08/2013, 14h01
  2. [Doctrine] Jointure multiple sur la même table
    Par npolbos dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/05/2010, 16h31
  3. [AC-2003] Jointure externe sur une même table
    Par jeff69 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/09/2009, 22h11
  4. Accès multiple sur une même table
    Par ravaid dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/04/2008, 14h09
  5. Accès multiple sur une même table
    Par ravaid dans le forum Développement
    Réponses: 3
    Dernier message: 18/04/2008, 13h27

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