2010-04-29 18 views
0

Je suis en train de faire un SELECT sur trois tables relationnelles comme ceux-ci:requête pour la liste des accessoires avec ou sans valeurs

table_materials 
-> material_id 
- material_name 

table_props 
-> prop_id 
- prop_name 

table_materials_props 
- row_id 
-> material_id 
-> prop_id 
- prop_value 

Sur ma page, je voudrais obtenir un résultat comme celui-ci, mais J'ai un problème avec la requête:

material prop A prop B prop C prop D prop E 
wood  350  NULL  NULL  84  16 
iron  NULL  17  NULL  NULL  201 
copper  548  285  99  NULL  NULL 

de sorte que la requête doit retourner quelque chose comme:

material prop_name  prop_value 
wood  prop A  350 
wood  prop B  NULL 
wood  prop C  NULL 
wood  prop D  84 
wood  prop E  16 
// and go on with others rows 

je pensais utiliser quelque chose comme:

SELECT * 
FROM table_materials AS m 
INNER JOIN table_materials_props AS mp 
ON m.material_id = mp.material_id 
INNER JOIN table_materials_props AS p 
ON mp.prop_id = p.prop_id 
ORDER BY p.prop_name 

le problème est la requête ne renvoie pas les NULL valeurs, et je dois même prop pour que tous les materials indépendamment des valeurs de prop sont NULL or not

I espérons que cet exemple est clair!

+0

-vous une liste fixe des « accessoires » dans votre table liée juste 5, ou était-ce juste un exemple ... Si fixé, serait votre intention que le nombre de "les accessoires" seraient étroitement contrôlés, et donc limités pour créer vos résultats de style de tableau croisé? – DRapp

+0

le nombre d'accessoires pourrait augmenter, j'ai donc décidé d'utiliser cette structure. – vitto

Répondre

0

Jointure croisée (ou jointure interne sans condition) toutes les options, puis gauche joint celles de la table d'entités associatives. La jointure gauche conserve les prop/matériaux même lorsque les combinaisons n'existent pas dans la table associative.

Untested:

SELECT * 
FROM table_materials AS m 
INNER JOIN table_props as p 
LEFT JOIN table_material_props AS mp 
ON p.prop_id = mp.prop_id 
AND 
m.material_id = mp.material_id; 
ORDER BY p.prop_name 
+0

Merci, ça a été très utile – vitto