Page 1 sur 1

[MySQL] Jointure avec WHERE ou JOIN

Posté : 08 janv. 2007, 15:34
par Rei Itchido
Bonjour à tous,

J'ai une petite question sur une requête MySQL. (petite précision, je bosse avec MySQL 4.0 donc je ne peux pas faire de sous-requêtes dans ma requête)

J'ai les tables t_user, t_classe et t_groupe.
Un user appartient à une classe qui appartient à un groupe.

Je cherche à récupérer le nom de l'user, le nom de sa classe, et le nom du groupe de la classe.

Avec la requête ci-dessous, j'arrive à récuperer les infos dont j'ai besoin

Code : Tout sélectionner

SELECT u.user_nom, c.classe_nom, g.groupe_nom FROM t_user as u, t_classe as c, t_groupe as g WHERE u.id_classe=c.id_classe AND c.id_groupe=g.id_groupe
1ere question : comment faire la même requête avec des INNER JOIN?
Car si on part avec t_user comme "table de base" de la requête, je ne vois pas comment faire car on a aucune relation directe entre la t_user et t_groupe.

Code : Tout sélectionner

SELECT u.user_nom, c.classe_nom, g.groupe_nom FROM t_user as u INNER JOIN t_classe as c ON u.id_classe=c.id_classe et là comment faire la jointure entre t_classe et g_groupe vu que la table de base est t_user?
2ème question :
Imaginons qu'une classe n'ait pas de groupe, avec ma 1ere requête qui fonctionne, je ne récuperai pas toutes les occurences car AND c.id_groupe=g.id_groupe ne sera pas toujours vrai.
Comment tout récuperer dès lors? Avec un LEFT JOIN? Mais alors j'ai besoin d'une requête de la forme de ma 1ère question

Merci de m'éclairer :merci:

Posté : 08 janv. 2007, 18:42
par pifou
tu peux "chainer" les jointures comme les perles sur un collier (proverbe chinois!)

Code : Tout sélectionner

SELECT u.user_nom, c.classe_nom, g.groupe_nom FROM (t_user as u INNER JOIN t_classe as c ON u.id_classe = c.id_classe) INNER JOIN t_groupe as g ON c.id_groupe=g.id_groupe
les parenthèses sont faculatives (d'ailleurs je suis pas sur de les avoir bien posées)... pour ta 2eme question, on peut supposer qu'il y a toujours une correspondance entre t_classe et t_groupe donc on fait cette jointure en premier... (sinon il faudrait 2 LEFT JOIN)

Code : Tout sélectionner

SELECT u.user_nom, c.classe_nom, g.groupe_nom FROM t_user as u LEFT JOIN (t_classe as c INNER JOIN t_groupe as g ON c.id_groupe=g.id_groupe) ON u.id_classe = c.id_classe

Posté : 08 janv. 2007, 22:15
par Rei Itchido
Merci pour ta réponse.
J'aurais cru que ça serait plus compliqué que ça :)

Pour info, ça peut toujours servir pour quelqu'un plus tard :

- pour la question 1

Code : Tout sélectionner

SELECT u.user_nom, c.classe_nom, g.groupe_nom FROM t_user as u INNER JOIN t_classe as c ON u.classe_id = c.classe_id INNER JOIN t_groupe as g ON c.groupe_id=g.groupe_id
- pour la question 2

Code : Tout sélectionner

SELECT u.user_nom, c.classe_nom, g.groupe_nom FROM t_user as u INNER JOIN t_classe as c ON u.classe_id = c.classe_id LEFT JOIN t_groupe as g ON c.groupe_id=g.groupe_id