2010-07-05 4 views
1

Je possède ce trois tableaux:Comment sélectionner les enregistrements qui correspondent aux critères définis dans une table de jointure?

products TABLE: 
id:integer 
name:string 

features TABLE: 
id:integer 
name:string 

features_products TABLE: 
product_id:integer 
feature_id:integer 

Le features_products TABLE me dit que les caractéristiques ont chaque produit. Par exemple:

product_id feature_id 
    1   3 
    1   5 
    3   4 

me dit que le produit 1 a des caractéristiques 3 et 5 et produit 3 FEATURE 4, également, produit 2 (si elle existe) n'a pas de fonctionnalités.

Ma question est, comment puis-je SELECT tous les produits des produits TABLE Wich ont determiné caractéristiques? Par exemple, SELECT products which have features 3 AND 5 ou SELECT products which have feature 2

+0

features_products I sous la direction. Merci. –

Répondre

5

Pour sélectionner tous les ids de produits pour les produits qui ont à la fois des caractéristiques 3 et 5:

SELECT product_id 
FROM features_products 
WHERE feature_id IN (3, 5) 
GROUP BY product_id 
HAVING COUNT(*) = 2 

Cela suppose qu'il ya un caractère unique sur contraint (product_id, feature_id). Si vous voulez que la ligne entière de la table de produit puis utilisez ceci dans une sous-requête:

SELECT * 
FROM products 
WHERE product_id IN (
    SELECT product_id 
    FROM features_products 
    WHERE feature_id IN (3, 5) 
    GROUP BY product_id 
    HAVING COUNT(*) = 2 
) 
+0

Ok. Cela marche. Je vous remercie. Je voudrais juste lire d'autres options et optimisations avant de l'accepter. –

0

Quelque chose de semblable à ceci:

select * from product 
where id in (select product_id from feature_products where feature id in (1,3)) 

échange le (1,3) pour les fonctionnalités que vous souhaitez inclure.

0

Vous pouvez faire ce qui suit à la jointure de ces tables et obtenir les données dont vous avez besoin:

SELECT * 
FROM products p JOIN features_products fp ON p.id = fp.product_id 
       JOIN features f ON f.id = fp.feature_id 
WHERE f.id = 3 OR f.id = 5 
Questions connexes