我正在尝试添加产品过滤功能。每个产品可以有任意数量的过滤器。
我已经像这样设置了我的桌子:
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.这是如何实现的?
答案 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 |
+------------+