Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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/04/2011, 21h03   #1
Membre régulier
 
Inscription : juin 2007
Messages : 198
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 198
Points : 90
Points : 90
Par défaut Jointure et ligne qui ne sors pas

Bonjour,

Un petit exemple rapide pour illustrer mon problème :
Soit une table VOITURE ayant les champs suivants :
id, marque, modèle, gamme avec id en clé primaire
Soit une table OPTION ayant les champs suivants :
id, option, voiture avec id en clé primaire et voiture en clé étrangère sur id de la table voiture
Quelques entrées de ma table VOITURE pourraient être :

id 1
marque citroen
modele c3
gamme eco

id 2
marque citroen
modele c3
gamme dynamique

id 3
marque citroen
modele c3
gamme exclusive

Pour la table OPTION j'aurai :
id 1
option vitres electriques
voiture 2

id 2
option peinture metal
voiture 2

id 3
option vitres electriques
voiture 3

id 4
option peinture metal
voiture 3

id 5
option clim
voiture 3

cela signifie que :
- la voiture citroen c3 eco n'a pas d'option
- la voiture citroen c3 dynamique a "vitres electriques" et "peinture metal" comme option
- la voiture citroen c3 exclusive a "clim", "vitres electriques" et "peinture metal" comme option
Mon problème est comment sortir une liste des voitures avec toutes leurs options en une seul requête.
J'avais bien trouvé ceci :
Code :
1
2
3
4
5
6
7
SELECT voiture.marque, 
voiture.modele, 
voiture.gamme, 
group_concat(concat(OPTION.OPTION SEPARATOR "-")) 
FROM voiture JOIN ON OPTION 
WHERE OPTION.voiture=voiture.id 
GROUP BY voiture.modele ;
Je pensais avoir ça :
citroen c3 eco
citroen c3 dynamique vitres electriques - peinture metal
citroen c3 exclusivevitres electriques - peinture metal - clim

Et bien non !
La première ligne ne sors pas !
J'imagine que c'est parce que la c3 eco n'a pas d'option, donc la jointure ne se fait pas et la ligne ne sors pas.
La solution serait de mettre une entrée avec option vide pour cette voiture dans la table OPTION mais bon, cela fait une entrée pour rien, inutile...
Y a t-il une valeur par défaut que l'on peut affecter au group_concat s'il ne trouve rien ? je doute de cette solution, je n'ai rien vu de tel dans la doc.
Une solution avec un join left, right ou autre ???
Je suis pas du tout à l'aise avec les différentes possibilités du JOIN...
Merci de votre aide !
fabrice91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 22h05   #2
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 878
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 878
Points : 7 655
Points : 7 655
Quand tu utilise JOIN, tu utilise en réalité INNER JOIN (jointure interne). Donc tu n'aura que les lignes dont la jointure renvoie des éléments des 2 cotés.

Dans ton cas il te faut tous les éléments de gauche sans exceptions et les éléments de droite quand ils existent. Donc une jointure gauche (ou jointure externe gauche) et donc c'est LEFT OUTER JOIN qu'il faut utiliser.

Par contre, je ne sais pas comment ton concat va se comporter avec les champs vides.
__________________
Sevyc64 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 22h56   #3
Membre régulier
 
Inscription : juin 2007
Messages : 198
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 198
Points : 90
Points : 90
Citation:
Envoyé par sevyc64 Voir le message
Dans ton cas il te faut tous les éléments de gauche sans exceptions et les éléments de droite quand ils existent. Donc une jointure gauche (ou jointure externe gauche) et donc c'est LEFT OUTER JOIN qu'il faut utiliser.
Merci beaucoup pour cette réponse, il va falloir que je creuse ce JOIN...
fabrice91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 20h27   #4
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Bonjour,
Je ne connais pas cette syntaxe de jointure que vous avez fait.
En reprenant une jointure interne comme vous l'avez écrit, ça serait plutôt quelque chose comme :
Code :
FROM VOITURE v INNER JOIN `OPTION` o ON o.voiture= v.id
au lieu de :
Code :
FROM voiture JOIN ON OPTION WHERE OPTION.voiture=voiture.id

D'autre part "OPTION" semble être un mot réservé alors si possible utilisez un autre mot pour votre table
patic est dé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 01h42.


 
 
 
 
Partenaires

Hébergement Web