سؤال

Rather than describe, I'll simply show what I'm trying to do. 3 tables in 3NF. product_badges is the join table. (The exists sub-query is necessary.)

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)
);

Now this will return all the products that have a badge_id of 1 OR 2 OR 3 OR 4. What I want is to get only the products that meet ALL those values. I tried to do pb.badge_id=1 AND pb.badge_id=2 etc but this returns nothing -- which makes sense to me now. I also tried doing multiple queries with an INTERSECT but that resulted in an error. I'm guessing multiple queries is the key but UNION is basically the same as IN and I'm not certain how to use a JOIN in this case.

هل كانت مفيدة؟

المحلول

Please try the following (assuming exactly 4 different required bagde_id's):

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
);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top