Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/08/2011, 14h06   #1
Invité de passage
 
Inscription : février 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 5
Points : 1
Points : 1
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 :
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
péhachepé est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 14h10   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bonjour,

il suffit de faire des jointures interne, un peu de lecture et vous comprendrez mieux :
http://sqlpro.developpez.com/cours/sqlaz/jointures/
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/08/2011, 14h48   #3
Invité de passage
 
Inscription : février 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 5
Points : 1
Points : 1
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 :
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
péhachepé est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 15h24   #4
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Ne melangez pas les jointures implicites et explicites...

Code :
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
__________________
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 15h33   #5
Membre régulier
 
Étudiant
Inscription : octobre 2010
Messages : 92
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 92
Points : 78
Points : 78
Code :
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.
zeclad01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 16h40   #6
Invité de passage
 
Inscription : février 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 5
Points : 1
Points : 1
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 :
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
péhachepé est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 17h12   #7
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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
__________________
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 10h17   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 013
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 013
Points : 18 289
Points : 18 289
Envoyer un message via MSN à CinePhil
Le besoin exprimé dans le premier message :
Citation:
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 :
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 :
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.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h24.


 
 
 
 
Partenaires

Hébergement Web