过滤具有所需类别ID和OR类别ID

时间:2017-05-09 14:59:12

标签: php mysql

我有一个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

1 个答案:

答案 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