从过滤器中选择的MYSQL查询

时间:2016-08-28 21:51:26

标签: php mysql

我正在尝试添加产品过滤功能。每个产品可以有任意数量的过滤器。

我已经像这样设置了我的桌子:

row_id products_id filters_id 
     1           1          1 
     2           2          2 
     3           3          3 
     4           4          3 
     5           1          3 

因此该表有product_ids列表和相应的filter_ids。由于这看起来像一个简单的表,我认为脚本很容易。但我真的很想弄清楚它。

我得到的查询是:

SELECT p.products_id
     , p.products_name
     , p.products_short_desc
     , p.products_price
     , p.products_url
     , p.products_image
     , p.products_short_desc
     , p.contact_pricing
     , GROUP_CONCAT(ptc.categories_id) category_id 
  FROM products p 
  LEFT 
  JOIN prod_to_cat ptc 
    ON ptc.products_id = p.products_id 
   AND ptc.categories_id IN (3) 
 WHERE p.products_status = 1
 GROUP 
    BY p.products_id 
HAVING COUNT(DISTINCT ptc.categories_id) = 1 
 ORDER  
    BY p.products_price

例如,如果只选择了一个过滤器,并且它是id 3.即使进行了大量调整,也无法正常工作。对于我认为会如此简单的事情,它似乎也很复杂。

基本上,我试图找出如何使用此表格选择所有匹配所有匹配过滤器的产品?

因此,如果选择了过滤器1和3,我希望得到匹配的所有产品的结果,即在表中包含其产品ID和相应的filter_ids。在这个例子中,它只返回products_id 1,如果只选择了过滤器id 3,它将返回产品3,4和1.这是如何实现的?

1 个答案:

答案 0 :(得分:2)

对我来说,这似乎相当简单:

DROP TABLE IF EXISTS product_filters;

CREATE TABLE product_filters
(product_id INT NOT NULL
,filter_id INT NOT NULL
,PRIMARY KEY(product_id,filter_id)
);

INSERT INTO product_filters VALUES
(1,1),
(2,2),
(3,3),
(4,3),
(1,3);

SELECT product_id 
  FROM product_filters 
 WHERE filter_id IN(1,3) 
 GROUP 
    BY product_id 
HAVING COUNT(*) = 2;
+------------+
| product_id |
+------------+
|          1 |
+------------+

SELECT product_id 
  FROM product_filters 
 WHERE filter_id IN(3) 
 GROUP 
    BY product_id 
HAVING COUNT(*) = 1;
+------------+
| product_id |
+------------+
|          1 |
|          3 |
|          4 |
+------------+