2012-07-20 1 views
0

Plutôt que de décrire, je vais simplement montrer ce que j'essaie de faire. 3 tables en 3NF. product_badges est la table de jointure. (Le existe sous-requête est nécessaire.)L'équivalent SQL de l'opérateur IN qui agit comme ET au lieu de OU?

SELECT * FROM shop_products WHERE EXISTS (// this line cannot change 
    SELECT * FROM product_badges as pb 
    WHERE pb.product_id=shop_products.id 
    AND pb.badge_id IN (1,2,3,4) 
); 

Maintenant, ce sera de retour tous les produits qui ont un badge_id de 1 ou 2 ou 3 ou 4. Ce que je veux est de obtenir uniquement les produits qui répondent à tous ces valeurs. J'ai essayé de faire pb.badge_id = 1 ET pb.badge_id = 2 etc mais cela ne retourne rien - ce qui me semble logique maintenant. J'ai également essayé de faire plusieurs requêtes avec un INTERSECT mais cela a entraîné une erreur. Je suppose que plusieurs requêtes sont la clé mais UNION est fondamentalement la même chose que IN et je ne suis pas certain de savoir comment utiliser un JOIN dans ce cas.

+1

Il ne fait pas vraiment de sens pour la colonne pour correspondre à toutes les valeurs. Un enregistrement peut avoir plusieurs colonnes, mais la colonne ne peut avoir qu'une seule valeur. –

+3

Vous recherchez l'opérateur de division relationnelle (qui n'existe pas) mais vous pouvez utiliser l'un des [méthodes ici] (http://www.simple-talk.com/sql/t-sql-programming/divided- we-stand-the-sql-of-relational-division /) –

+0

@ Ek0nomik - cette colonne fait partie d'une table de jointure many-to-many reliant plusieurs attributs à plusieurs produits. Pensez-y comme à la recherche de pantalons, mais au lieu de retourner tous les pantalons, je veux seulement un pantalon avec des poches et des poches cargo et un bouton mouche. Le badge_id est en corrélation avec chacun de ces attributs – iamsar

Répondre

3

S'il vous plaît essayer ceci (en supposant exactement quatre différentes années bagde_id requis):

SELECT * FROM shop_products WHERE EXISTS (// this line cannot change 
    SELECT pb.product_id, count(distinct pb.bagde_id) FROM product_badges as pb 
    WHERE pb.product_id=shop_products.id 
    AND pb.badge_id IN (1,2,3,4) 
    GROUP BY pb.product_id 
    HAVING count(distinct pb.bagde_id) = 4 
); 
+0

Génial, merci. Énorme aide – iamsar

Questions connexes