【发布时间】:2016-08-29 08:00:20
【问题描述】:
我正在尝试添加产品过滤器功能。每个产品可以有任意数量的过滤器。
我的桌子是这样设置的:
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。即使进行了很多调整,它也无法正常工作。它也似乎从公平到复杂,因为我认为本来会如此简单。
所以本质上,我想弄清楚如何使用此表来选择所有具有所有匹配过滤器 ID 的产品?
因此,如果选择了过滤器 1 和 3,我希望生成所有匹配的产品的结果,即在带有产品 ID 和相应 filter_ids 的表中。在这个例子中,它只会返回 products_id 1,如果只选择过滤器 id 3,它将返回 product 3,4 和 1。这是如何实现的?
【问题讨论】:
-
所以如果选择了过滤器 1 和 3,输出将显示行 id 1,3,4,5?
-
不,它不是 OR,它是 AND。因此,如果选择了过滤器 1 和 3,则只会显示 products_id 1。例如。你想要一件红色连衣裙,中号,而不是红色连衣裙或中号连衣裙。
-
我不确定我是否遵循,过滤器是否应用于对象的多个列(属性)?
-
那么您的查询出了什么问题,除了使用错误的表 (
prod_to_cat) 和/或错误的列 (ptc.categories_id IN (3))? -
因为 IN() 使用 OR,我想要 AND。