我有一个categories
表(category_id,category_name),其中包含以下类型:
Website1
Website2
Product_type1
Product_type2
red
blue
green
wood
plastic
metal
products
表(prod_id,prod_name ...等)和链接表product_cateogries
(id,prod_id,category_id)。
我尝试运行查询来过滤这些值,但有些类别是必需的,有些是X或X.例如,我希望能够选择所有Website1
和{{ 1}}红色或蓝色的产品。
我的第一个想法是我可以Product_type2
,但这会使IN (Product_type2_id, Website2_id, red_id, blue_id)
和Product_type2_id
成为可选项。当产品只能有一种颜色时,使用Website2_id
可确保找到所有colours_id。是否需要某个子查询?
TABLES:
类别:
GROUP BY prod_id HAVING count(distinct category_id) = 4)
PRODUCT_CATEGORY:
id (int)
category_name (varchar)
产品:
id (int)
product_id, (int)
category_id (int)
SQL小提琴:
http://sqlfiddle.com/#!9/32ec8
更新:
下面的查询现在完全符合我的要求,虽然看起来有点乱,但是应该有一个更清洁的方式?
prod_id (int)
prod_image
prod_price
答案 0 :(得分:1)
只需使用联接
SELECT p.*
FROM products p
LEFT JOIN product_category pc_w1 ON
pc_w1.product_id = p.prod_id AND pc_w1.category_id = 3
LEFT JOIN product_category pc_pt2 ON
pc_pt2.product_id = p.prod_id AND pc_pt2.category_id = 7
LEFT JOIN product_category pc_rb ON
pc_rb.product_id = p.prod_id AND pc_rb.category_id IN (9,13) -- black/blue
WHERE
pc_w1.product_id IS NOT NULL OR
(
pc_pt2.product_id IS NOT NULL AND
pc_rb.product_id IS NOT NULL
)
GROUP BY p.prod_id
编辑:我看到你添加了小提琴,所以这是我的工作示例http://sqlfiddle.com/#!9/837872/4