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 03/03/2011, 11h37   #1
Membre du Club
 
Avatar de pepper18
 
Inscription : novembre 2005
Messages : 181
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : novembre 2005
Messages : 181
Points : 62
Points : 62
Par défaut Conditions sur la table de droite d'un LEFT OUTER JOIN

Bonjour à tous,

Voici mon exemple en simplifié :

Table_Gauche :

ID Nom

1 Dupond
2 Dubois
3 Durand
4 Martin

Table_Droite (précise pour l'ID d'une personne quelle est sa ville) :

ID Ville

1 Paris
2 Lyon
4 Marseille

Donc ce que je voudrai c'est faire une jointure entre les 2 tables en gardant toutes les lignes de la Table_Gauche. Dans mon exemple Durand n'a pas de ville associée mais j'aimerai quand même qu'il apparaisse. Donc j'utilise ca :

Code :
SELECT * FROM Table_Gauche LEFT OUTER JOIN Table_Droite ON Table_Gauche.ID = Table_Droite.ID
Jusque là tout va bien. Maintenant je veux ajouter une condition sur la Table_Droite par exemple pour exclure du résultat les personnes dont la ville est Marseille et obtenir ce résultat :

ID Nom Ville

1 Dupond Paris
2 Dubois Lyon
3 Durand NULL

Je pensais utiliser ca :

Code :
SELECT * FROM Table_Gauche LEFT OUTER JOIN Table_Droite ON Table_Gauche.ID = Table_Droite.ID WHERE Table_Droite.Ville <> 'Marseille'
Mais du coup comme je mets une condition sur la Table_Droite, le résultat ne m'affiche que les lignes qui sont présentes dans Table_Droite :

ID Nom Ville

1 Dupond Paris
2 Dubois Lyon


J'espère avoir été assez clair.

Merci beacoup de votre aide.
pepper18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 11h46   #2
Membre du Club
 
Avatar de pepper18
 
Inscription : novembre 2005
Messages : 181
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : novembre 2005
Messages : 181
Points : 62
Points : 62
Bon ben le fait de l'écrire et de le simplifier m'a aidé à trouver la solution tout seul...

Donc il suffit d'utiliser un RIGHT JOIN au lieu d'un LEFT JOIN et d'imbriquer un SELECT * FROM Table_Droite WHERE ... dans le FROM de ma jointure.
pepper18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 12h39   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Non votre solution me paraît fausse, il suffit de faire ainsi :
Code :
1
2
3
4
5
SELECT *
  FROM Table_Gauche
       LEFT OUTER JOIN Table_Droite
         ON Table_Droite.ID = Table_Gauche.ID
        AND Table_Droite.Ville <> 'Marseille'
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 16h43   #4
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Si j'ai bien compris la question, le résultat ne sera pas bon. Waldar, ta requête renvoie:
1 Dupond Paris
2 Dubois Lyon
3 Durand NULL
4 Martin NULL

Pour que Martin soit éliminé, j'aurai plutôt vu ceci:
Code SQL :
1
2
3
4
5
6
 
SELECT *
  FROM Table_Gauche
       LEFT OUTER JOIN Table_Droite
         ON Table_Droite.ID = Table_Gauche.ID
        WHERE Table_Droite.Ville <> 'Marseille' OR Table_Droite.Ville IS NULL

Tatayo
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 03/03/2011, 17h37   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Tout-à-fait Tatayo, j'avais mal compris le problème.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 16h32   #6
Invité régulier
 
Inscription : février 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 13
Points : 5
Points : 5
Bonjour à tous

je voudrais rebondir sur ce post puisque j'ai le même type de problème qu'annoncé au dessus mais je ne trouve pas de réponse...

je suis sur Mysql (je ne sais pas si cela a de l'importance)

j'ai une table de voiture

ID - Nom
1 - voiture 1
2 - voiture 2
3 - voiture 3
4 - voiture 4
...

et des photos

ID - Nom - Profile - voiture_id
1 - photo_voiture_10 - 0 - 1
2 - photo_voiture_20 - 0 - 2
3 - photo_voiture_30 - 0 - 3
4 - photo_voiture_40 - 0 - 4
1 - photo_voiture_11 - 1 - 1
2 - photo_voiture_21 - 1 - 2
3 - photo_voiture_31 - 1 - 3
4 - photo_voiture_41 - 0 - 4


Autrement dit, chaque voiture a 2 photos, une dont le profile est égal à 1(TRUE) une autre dont le profile vaut 0 (FALSE), sauf pour la voiture 4 qui a deux "profile" égaux à 0(FALSE)

Je voudrais rapatrier TOUTES MES VOITURES (quelque soit la valeur du profil de la photo) ainsi que la photo profile = 1 (si la voiture en a une) leur correspondant. je voudrais en fait ceci :

ID_voiture - Nom_Photo
1 - photo_voiture_11
2 - photo_voiture_21
3 - photo_voiture_31
4 - NULL

Voici ma requête actuelle :

SELECT v.id, v2.nom
FROM voiture v
LEFT OUTER JOIN voiture_photo v2 ON v2.voiture_id = v.id
WHERE v2.profile =1
OR v2.profile IS NULL
LIMIT 0 , 30


Cette requête ne me rend pas la ligne pour ma voiture 4... et soit j'ai mal compris ce qui a été dit au dessus, soit j'ai un gros problème...

quelqu'un pourrait m'aider??? merci !
Mattyman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 17h01   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Il faut que vous mettiez la condition dans votre jointure externe, et non dans votre filtre :

Code SQL :
1
2
3
4
5
6
7
 
SELECT v.id, v2.nom
FROM voiture v
LEFT OUTER JOIN voiture_photo v2 
    ON v2.voiture_id = v.id
    AND v2.profile =1
LIMIT 0 , 30
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/03/2011, 17h32   #8
Invité régulier
 
Inscription : février 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 13
Points : 5
Points : 5
MERCI pour tout ca marche impec!

je ne suis vraiment pas un grand développeur, et me donner cette solution, c'est comme me faire sortir de ma maison et me montrer tout l'univers des possibles !!!

merci
Mattyman est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web