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 sur trois tables


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 132
    Par défaut Jointures sur trois tables
    Bonsoir,

    Je cherche à rejoindre trois tables qui sont toutes en 'relation' je débute en SQL alors pardonnez mes erreurs ou inepties si tant est qu'il y en ait.

    J'ai donc trois tables comme ceci :

    table_sites :
    ____________________________
    | id | name | directory_id | (etc...|
    |--------------------------------|

    table_galeries :
    _______________________
    | id | site_id | set_id | titre |
    |--------------------------|
    ( site_id correspond à table_sites.directory_id )

    table_images :
    ___________________________________
    | id | set_id | img_id | url_full | url_thumb |
    |----------------------------------------|
    ( set_id correspond ici à table_galeries.set_id )

    Pour les relier donc j'utilise la requête suivante :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT G.`site_id` , G.`set_id` , G.`title` , S.`sitename` , I.`url_full` , I.`url_thumb`
    FROM `fhg_galeries` G
    INNER JOIN `fhg_sites` S ON G.`site_id` = S.`directory_id`
    INNER JOIN `fhg_images` I ON G.`set_id` = I.`set_id`

    J'ai bien les données nécessaires dont j'ai besoin, cependant, et logiquement, sur chaque ligne j'ai les informations concernant la table_sites, et la table_galeries qui se répètent.
    Ce qui a pour conséquence d'alourdir pas mal le résultat.

    Dans l'idéal j'aimerai que les informations relatives au site et à la galerie ne soit présente qu'une seule fois.
    C'est à dire ne pas avoir pour chaque lignes différentes (des images) avoir les informations relatives au site et à la gallerie.

    Est ce possible ?
    Que me conseillez vous ?
    Est ce que cette alourdissement du résultat peut avoir de réelles conséquences ?

    Merci d'avance.

  2. #2
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Bonjour,

    Il y a visiblement un problème de conception, mais la requête suivante avec ses 2 sous-requêtes devrait peut-être répondre à vos attentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT I.url_full, I.url_thumb, G.site_id, G.set_id, G.title, S.sitename
    FROM 
       (select distinct site_id, set_id, title from fhg_galeries) G
       INNER JOIN 
          (select distinct sitename from fhg_sites) S ON G.site_id = S.directory_id
       INNER JOIN 
          fhg_images I ON G.set_id = I.set_id

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 132
    Par défaut
    Citation Envoyé par chrifo Voir le message
    Bonjour,

    Il y a visiblement un problème de conception, mais la requête suivante avec ses 2 sous-requêtes devrait peut-être répondre à vos attentes :
    étant débutant, je suis ouvert à toute critique constructive alors je serai curieux de savoir ce qui cloche dans ma conception et comment je pourrai l'améliorer ?

    concernant le code, merci, je m'en vais tout de suite essayer.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 132
    Par défaut
    Citation Envoyé par chrifo Voir le message
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT I.url_full, I.url_thumb, G.site_id, G.set_id, G.title, S.sitename
    FROM 
       (select distinct site_id, set_id, title from fhg_galeries) G
       INNER JOIN 
          (select distinct sitename, directory_id from fhg_sites) S ON G.site_id = S.directory_id
       INNER JOIN 
          fhg_images I ON G.set_id = I.set_id
    Bon alors j'ai essayé ce code, et en terme de traitement ça a l'air très lourd, l'exécution est très très longue.
    J'avoue que je ne sais pas ce qui ralentit la requête, mais finalement la requête que j'avais écrite est beaucoup plus rapide, d'autant que celle ci ne m'apporte rien de plus.
    Mais peut être ai je raté quelque chose...

    Cela dit ça me permet au moins peut être de préciser un peu ce que j'aimerai.. (bien que n'étant pas sur de la réalisation)
    ça serait un résultat sous forme d'un tableau à plusieurs dimensions...

    En effet, fhg_images contient LES adresses d'images appartenant à UNE galerie et à UN site

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je pense que ce que vous voulez est uniquement de la présentation, et ce n'est pas la vocation première d'un SGBD, ce genre de chose étant effectué ultérieurement dans un outil ou un langage de programmation tiers.

    Néanmoins c'est faisable facilement avec la fonction analytique LAG(), mais je ne sais pas si votre SGBD la supporte.

    A défaut vous n'avez pas d'autre choix qu'alourdir énormément votre requête pour du traitement "visuel".

    Concernant la conception effectivement il y a quelques écueils.

    Par exemple vos tables ont l'air d'avoir deux id ?
    Et pourquoi cet id change-t'il de nom dans les autres tables ?

    Rapidement, avec les données dont je dispose, la structure suivante paraît plus correcte :

    table_sites :
    ____________________________
    | site_id (PK) | name | (etc...|
    |--------------------------------|

    table_galeries :
    _______________________
    | galerie_id (PK) | site_id (FK) | titre |
    |--------------------------|

    table_images :
    ___________________________________
    | image_id (PK)| galerie_id (FK)| url_full | url_thumb |
    |----------------------------------------|

  6. #6
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Citation Envoyé par SPKlls Voir le message
    En effet, fhg_images contient LES adresses d'images appartenant à UNE galerie et à UN site
    La requête que je vous ai proposée avait pour but de supprimer des doublons et est donc effectivement complètement à côté de la plaque.

    Je plussoie les réponses données par Waldar au niveau de la conception et de la non gestion de la "cosmétique" par SQL.

    J'ajouterais simplement que si vous êtes sous access cela peut il me semble être fait par des requêtes "analyse croisée".

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 132
    Par défaut
    merci à vous pour vos conseils !

    j'ai donc recréer mes tables comme ceci :

    Code SQL : 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
     
    # SHOW CREATE TABLE `fhg_sites` :
    CREATE TABLE `fhg_sites` (
      `site_id` int(11) NOT NULL auto_increment,
      `join_url` varchar(512) NOT NULL,
      `banner_url` varchar(512) NOT NULL,
      PRIMARY KEY  (`site_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    #
    #
    # SHOW CREATE TABLE `fhg_galleries` :
    CREATE TABLE `fhg_galleries` (
      `gallery_id` int(11) NOT NULL auto_increment,
      `site_id` int(11) NOT NULL,
      `desc` varchar(512) NOT NULL,
      `nb_pics` int(11) NOT NULL,
      PRIMARY KEY  (`gallery_id`),
      KEY `site_id` (`site_id`),
      CONSTRAINT `fhg_galleries_ibfk_1` FOREIGN KEY (`site_id`) REFERENCES `fhg_sites` (`site_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    #
    #
    # SHOW CREATE TABLE `fhg_images` :
    CREATE TABLE `fhg_images` (
      `image_id` int(11) NOT NULL auto_increment,
      `gallery_id` int(11) NOT NULL,
      `url_full` varchar(512) NOT NULL,
      `url_thumb` varchar(512) NOT NULL,
      PRIMARY KEY  (`image_id`),
      KEY `gallery_id` (`gallery_id`),
      CONSTRAINT `fhg_images_ibfk_1` FOREIGN KEY (`gallery_id`) REFERENCES `fhg_galleries` (`gallery_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    Code SQL : 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
     
    mysql> describe `fhg_sites`;
    +------------+--------------+------+-----+---------+----------------+
    | Field      | Type         | Null | Key | Default | Extra          |
    +------------+--------------+------+-----+---------+----------------+
    | site_id    | int(11)      | NO   | PRI | NULL    | auto_increment |
    | join_url   | varchar(512) | NO   |     |         |                |
    | banner_url | varchar(512) | NO   |     |         |                |
    +------------+--------------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)
     
    mysql> describe `fhg_galleries`;
    +------------+--------------+------+-----+---------+----------------+
    | Field      | Type         | Null | Key | Default | Extra          |
    +------------+--------------+------+-----+---------+----------------+
    | gallery_id | int(11)      | NO   | PRI | NULL    | auto_increment |
    | site_id    | int(11)      | NO   | MUL |         |                |
    | desc       | varchar(512) | NO   |     |         |                |
    | nb_pics    | int(11)      | NO   |     |         |                |
    +------------+--------------+------+-----+---------+----------------+
    4 rows in set (0.00 sec)
     
    mysql> describe `fhg_images`;
    +------------+--------------+------+-----+---------+----------------+
    | Field      | Type         | Null | Key | Default | Extra          |
    +------------+--------------+------+-----+---------+----------------+
    | image_id   | int(11)      | NO   | PRI | NULL    | auto_increment |
    | gallery_id | int(11)      | NO   | MUL |         |                |
    | url_full   | varchar(512) | NO   |     |         |                |
    | url_thumb  | varchar(512) | NO   |     |         |                |
    +------------+--------------+------+-----+---------+----------------+

    En réponse aux erreurs évoquées, je crois qu'effectivement, j'ai quelques peu confondu la vue avec le résultat.
    Il me paraissait un peu lourd et contraignant de 'répéter' pour chaque image le nom du site, le titre de la galerie, et toutes les autres informations relatives mais il semblerait qu'en réalité il n'y est pas de 'requête' pour chaque ligne d'image (ce que je pensais) mais simplement une association, ce qui a pour conséquence de ne pas alourdir la requête.

    Je vais donc à présent me pencher sur la création de la requête la plus efficace pour relier ces 3 tables.

    Je reste donc ouvert à tout autre conseil : )

    Merci encore

  8. #8
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Ne cherchez pas plus loin que la requête simple avec les 2 "inner join".
    MySQL doit créer automatiquement les index sur les PK, mais pensez bien à créer ceux sur les 2 FK.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Oui vous pouvez reprendre et adapter votre première requête et enlever le DISTINCT qui me paraît inutile.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 132
    Par défaut
    merci beaucoup pour ces précieux conseils.

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

Discussions similaires

  1. Requete SQL avec jointure sur trois tables
    Par pit2121 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/05/2008, 23h07
  2. Requête SQL avec jointure sur trois tables
    Par pit2121 dans le forum SQL
    Réponses: 0
    Dernier message: 19/05/2008, 20h24
  3. Jointure sur trois tables
    Par user126 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/02/2008, 17h07
  4. [SQL Server 8] Discussion : Full Jointure sur trois tables
    Par Baquardie dans le forum Langage SQL
    Réponses: 5
    Dernier message: 22/12/2006, 14h01
  5. jointure sur TROIS tables
    Par caribou_belle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/03/2004, 11h20

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