MySQL : vérification de syntaxe de double jointure

MySQL : vérification de syntaxe de double jointure - SQL/NoSQL - Programmation

Marsh Posté le 27-07-2010 à 08:39:09    

Bonjour,
 
Je crois que j'ai un gros souci avec les requêtes jointes.
 
J'ai trois tables à joindre.
 
TABLE 1 contient un id et les entrées suivantes :
- Apple
- Sony
- Nokia
- Samsung
- HTC
- Blackberry
 
TABLE 2 contient un id, l'id de la marque, l'id du type de portable (voir table 3) et les entrées suivantes :
- iPhone 3G
- iPhone 3GS
- iPhone 3GS NB
- iPhone 4G
- N63
- 3710
- etc.
 
TABLE 3 contient un id et :
- Slide
- Monobloc
- Clapet
 
Je les joints comment ces trois tables ?
Car je fais  

Code :
  1. SELECT blabla FROM table1 LEFT JOIN table2 ON table2.marque = table1.id LEFT JOIN table3 ON table3.id = table2.type


 
Et quand je veux un modèle en particulier :

Code :
  1. SELECT blabla FROM table1 LEFT JOIN table2 ON table2.marque = table1.id LEFT JOIN table3 ON table3.id = table2.type WHERE table1.marque = 'Apple' AND table2.modele = 'iPhone 3G' AND table3.type = 'Monobloc'


Je fais une requête avec autant de conditions au cas par exemple où il y aurait deux versions de ce téléphone : l'une monobloc et l'autre à clapet par exemple.
 
Et bien ça ne fonctionne pas  :cry: Le dernier critère fait tout planter. En gros, si je le met pas, tout fonctionne, si je le met, je récupère que la marque.
 
Ma syntaxe n'est pas bonne ?
 
Un grand merci à vous :bounce:

Reply

Marsh Posté le 27-07-2010 à 08:39:09   

Reply

Marsh Posté le 28-07-2010 à 09:47:30    

Question bête : pourquoi tu fais un left join et non un inner join vue que les relations entre les tables 1 et 2 ainsi que 2 et 3 sont de type 1-n et non 0-n :??:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-07-2010 à 15:32:28    

J'ai réglé mon souci qui venait des données mais je n'ai pas compris ta remarque ? SI je remplace par des inner, ça ne fonctionne plus.

Reply

Marsh Posté le 28-07-2010 à 16:05:20    

un left join suppose que le champ servant à la jointure de la table de gauche n'a pas forcément de correspondance dans le champ de la table de droite.
EX :
Table 1
ID    Valeur
1        Toto
2        Titi
3        Tata
 
Table 2
ID    Type     IDt1
1       TP1       1
2       TP1       1
3       TP2       3
 
IDt1 sert à la jointure entre la table 1 et al table 2. Si je fais une requête avec inner join, j'aurais 2 lignes pour 'Toto' et une ligne pour 'Tata' mais rien pour 'Titi'. Avec un left join, t'auras 4 lignes, les 3 mêmes que précédemment et une ligne pour 'Titi' avec la valeur NULL pour les valeurs de la table 2.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-07-2010 à 16:14:32    

Oui c'est bien ce que je veux!

Reply

Marsh Posté le 28-07-2010 à 16:19:58    

Vue la structure de tes 3 tables, j'ai des doutes sur le bien fondé d'un left join :/ Un modèle de téléphone a forcément une marque et a forcément un type (slide, clapet...), non?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-07-2010 à 16:26:11    

rufo a écrit :

Vue la structure de tes 3 tables, j'ai des doutes sur le bien fondé d'un left join :/ Un modèle de téléphone a forcément une marque et a forcément un type (slide, clapet...), non?


 
+1


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 28-07-2010 à 16:54:30    

Non, ce sont des données d'exemple ;) Mes données sont différentes et un modèle n'a pas forcément de type.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed