【问题标题】:MYSQL query that selects from filters从过滤器中选择的 MYSQL 查询
【发布时间】: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。

标签: php mysql


【解决方案1】:

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

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 |
+------------+

【讨论】:

  • 谢谢,完整的查询是什么,以便我可以测试它?
  • 根据提供的数据集,这将是完整的查询。如果您想要更全面的答案,请提出更全面的问题!我的回答应该作为一个例子。
  • 哦!所以它通过显示计数与过滤器数量相同的行来工作?这真是太聪明了。
  • 所以我只需要弄清楚如何加入 products 表,它应该会摇摆不定
猜你喜欢
  • 2015-08-19
  • 2018-08-14
  • 2023-03-14
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多