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 :

Requête mettant en relation 4 tables


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Requête mettant en relation 4 tables
    Bonjour,
    Je bute sur une requête nécessitant surement une jointure mais je ne trouve pas !

    Voila, mon sujet comprend 4 tables, entre [...] le nom de mes champs :
    - destinations [id_destination,...]
    - regions [id_region, id_destination,...]
    - circuits [id_circuit, id_region,id_type_voyage...]
    - type_voyage [id_type_voyage,...]

    Je souhaite afficher les types de voyage correspondant à des circuits existant dont la destination est envoyé par une variable (via une liste déroulante).

    Voici le début de ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT id_type_voyage 
    FROM type_voyage 
    WHERE id_type_voyage IN 
    (SELECT id_type_voyage
     FROM  circuits
     WHERE ????)
    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    il suffit de faire des jointures interne, un peu de lecture et vous comprendrez mieux :
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

  3. #3
    Candidat au Club
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci pour le lien, je vais m'en imprégner.

    Voici la requête avec les jointures internes mais cela ne marche pas encore.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT id_type_voyage,titre_type_voyage
    FROM type_voyage T,destinations D
    INNER JOIN circuits C 
                    ON (C.id_type_voyage=T.id_type_voyage)
    INNER JOIN regions  R
                    ON  (C.id_region=R.id_region)
    INNER JOIN destinations 
    		ON (R.id_destination=D.id_destination)
    WHERE D.id_destination=$id_destination
    Merci

  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
    Ne melangez pas les jointures implicites et explicites...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT id_type_voyage,titre_type_voyage
    FROM type_voyage T
    INNER JOIN circuits C 
             ON (C.id_type_voyage=T.id_type_voyage)
    INNER JOIN regions  R
                    ON  (C.id_region=R.id_region)
    INNER JOIN destinations D 
    		ON (R.id_destination=D.id_destination)
    WHERE D.id_destination=$id_destination

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Points : 104
    Points
    104
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT att1_tab1,att2_tab1,att3_tab1,att1_tab2,att2_tab2,att1_tab3 FROM tab1,tab2,tab3 WHERE tab1.att1_tab1 = tab2.att2_tab2 AND tab1.att1_tab1 = tab3.att1_tab3 AND tab1.att2_tab1 = "kikoolol" AND tab2.att1_tab2 = "bonjour" AND tab1.att3_tab1 = "c'est bon ?"
    Je pense qu'il s'agit d'un truc comme ça que tu veux.
    Si t'as pas tout compris, donne les tables et les champs qui t'intéresses, je te ferai une requête adaptée à ton code.

  6. #6
    Candidat au Club
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci à vous

    J'ai finalement remis les jointures internes à plus tard, j'ai suivi les conseils de zeclad01 en faisant une requête simple, maintenant c'est peut être pas le plus optimisé.

    Voici ma requête pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T.id_type_voyage,T.titre_type_voyage,C.id_type_voyage,C.id_region,R.id_region,R.id_destination,D.id_destination
    FROM type_voyage T, circuits C, regions  R, destinations D 
    WHERE T.id_type_voyage=C.id_type_voyage AND C.id_region=R.id_region AND R.id_destination=D.id_destination AND D.id_destination=$id_destination
    GROUP BY T.id_type_voyage

  7. #7
    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
    Mais votre requete dite "simple" manipule des jointures internes (seulement elles ne sont pas explicites, mais implicites).
    Dans votre requete, vous utilisez un GROUP BY, pourquoi ? vous n'avez aucune fonction d'aggrégation.

    Je ne saurai quand meme trop vous conseiller de potasser quelques tutoriels (celui ci par exemple)

    Bon courage

  8. #8
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Le besoin exprimé dans le premier message :
    Je souhaite afficher les types de voyage correspondant à des circuits existant dont la destination est envoyé par une variable (via une liste déroulante).
    Ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T.id_type_voyage,T.titre_type_voyage,C.id_type_voyage,C.id_region,R.id_region,R.id_destination,D.id_destination
    FROM type_voyage T, circuits C, regions  R, destinations D 
    WHERE T.id_type_voyage=C.id_type_voyage AND C.id_region=R.id_region AND R.id_destination=D.id_destination AND D.id_destination=$id_destination
    GROUP BY T.id_type_voyage
    Que viennent faire la région et la destination dans le SELECT si tu ne cherches que les types ?
    Et je suis bien entendu du même avis que Yanika_bzh sur les jointures mal écrites et le GROUP BY inutile !

    Voici la requête qui je pense répond à ton besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT T.id_type_voyage,T.titre_type_voyage
    FROM type_voyage T
    INNER JOIN circuits C ON T.id_type_voyage = C.id_type_voyage
        INNER JOIN regions  R ON C.id_region = R.id_region
    WHERE R.id_destination = $id_destination
    Remarques :
    1) Puisque ta variable est id_destination qui figure dans la table regions, pas besoin de jointure avec la table destinations.
    2) Tu devrais nommer tes tables au singulier.
    3) Prend la bonne habitude d'indenter et d'aérer ton code, c'est plus facile à lire et donc à débugguer.
    J'ai lu récemment dans une signature une phrase amusante qui va dans ce sens :
    Citation Envoyé par Goldocrack
    Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse.

Discussions similaires

  1. Relation entre table et requête
    Par movlw dans le forum Débuter
    Réponses: 6
    Dernier message: 28/07/2014, 11h13
  2. [MySQL] Requête d'insertion et relation avec table
    Par demon66 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 10/11/2009, 23h17
  3. relations entre tables
    Par ilyassou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/11/2005, 08h48
  4. access2000, probleme creation relations de tables
    Par nono_60 dans le forum Access
    Réponses: 2
    Dernier message: 12/09/2005, 23h50
  5. [HTTP]Créer une requête http multipart/related
    Par jothi35 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 05/04/2005, 16h32

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