我正在一个项目中工作,我想展示产品,受到某些过滤器。假设我有以下2张表:
产品
id name
--------------
1 'Product 1'
2 'Product 2'
筛选器
product_id filter_id
----------------------
1 a
1 b
2 a
我正在尝试编写一个查询,该查询仅在设置了过滤器的情况下返回产品。因此,如果过滤器'a'是活动的,结果应该是乘积1和2,如果'a'和'b'是活动的,它应该只返回乘积1。
我试过:
SELECT p.id
FROM products p
LEFT JOIN filters f ON f.product_id = p.id
WHERE filter.id = 'a'
GROUP BY p.id
这将按预期返回产品%1和%2的ID。然而,当我尝试:
SELECT p.id
FROM products p
LEFT JOIN filters f ON f.product_id = p.id
WHERE filter.id = 'a' AND filter.id = 'b'
GROUP BY p.id
我希望它返回产品1的id,但它没有返回任何结果。如何重写查询,以便获得活动筛选器的产品ID?这能用MySQL单独完成吗,还是我必须用PHP循环遍历结果?
您的查询只需要稍作更改:使用OR而不是AND...将其更改为:
SELECT p.id
FROM products p
LEFT JOIN filters f ON f.product_id = p.id
WHERE filter_id in ('a','b')
GROUP BY p.id
HAVING COUNT(*) = no_of_filters