【问题标题】:How can I apply product range filters using MySQL如何使用 MySQL 应用产品范围过滤器
【发布时间】:2021-08-22 08:18:06
【问题描述】:

我正在努力为我的一个项目解决这个问题。我正在使用 codeigniter 3 和 MySQL 8。所以请帮助我的专家。这是描述。

我有 2 个表格如下:

产品:

| id | name      |
| -- | --------- |
| 1  | Product 1 |
| 2  | Product 2 |
| 3  | Product 3 |
| 4  | Product 4 |

产品过滤器:

| product_id | filter_id | value  |
| ---------- | --------- | ------ |
| 1          | 1         | 60     |
| 1          | 2         | 40     |
| 2          | 1         | 400    |
| 2          | 2         | 30     |
| 3          | 1         | 80     |
| 3          | 2         | 20     |
| 4          | 1         | 50     |
| 4          | 2         | 100    |

SQL 供您参考:

CREATE TABLE IF NOT EXISTS `product` (
  `id` int(10) unsigned NOT NULL,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `product` (`id`, `name`) VALUES
  ('1', 'Product 1'),
  ('2', 'Product 2'),
  ('3', 'Product 3'),
  ('4', 'Product 4');
  
CREATE TABLE IF NOT EXISTS `product_filter` (
  `product_id` int(10) unsigned NOT NULL,
  `filter_id` int(10) unsigned NOT NULL,
  `value` int(10) unsigned NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `product_filter` (`product_id`, `filter_id`, `value`) VALUES
  ('1', '1', '60'),
  ('1', '2', '40'),
  ('2', '1', '400'),
  ('2', '2', '30'),
  ('3', '1', '80'),
  ('3', '2', '20'),
  ('4', '1', '50'),
  ('4', '2', '100');

http://sqlfiddle.com/#!9/8c071f

对于一个产品,可以有多个如上所述的过滤器。但不能有两次相同的过滤器。对于每个产品,每个过滤器都可以有一个值。

我想有以下场景:

  • 过滤 1 和 0 到 200 之间的值
  • 过滤器 2 和 0 到 50 之间的值。

例如,我有 10 个电源适配器。我想用电压和瓦特过滤掉它。因此,滤波器 1 将是电压,2 将是瓦特。现在我发送范围值以通过消耗 0 - 200 伏和 0 - 50 瓦来过滤特定产品。我的意思是这两个条件都应该适用。

结果应该是产品列表:

| id | name      |
| -- | --------- |
| 1  | Product 1 |
| 3  | Product 3 |

我使用多个 AND 尝试了以下 sql,它返回一个空结果。这是我使用的示例查询。

SELECT p.*
FROM product p
JOIN product_filter fp ON fp.product_id = p.id
WHERE
(
   fp.filter_id = 1 AND fp.value >= 0 AND fp.value <= 200
) AND 
(
   fp.filter_id = 2 AND fp.value >= 0 AND fp.value <= 50
)

我怎样才能得到上述答案?请帮忙。

【问题讨论】:

  • 你能提供一个同时小于 0 和大于 100 的数字的例子吗?
  • 是的,我更新了问题。
  • 我没听懂你说什么?
  • 顺便说一句,一个产品不能有两次相同的过滤器 ID。因此,对于特定的过滤器,它只能获得一个值。
  • 所以value 的值其中value &lt;= 0 AND value =&gt; 200 是...? filter_id 的值,其中(filter_id = 1 AND ...) AND (filter_id = 2 AND ...) 是...? PSminimal reproducible exampleHow to AskHelp center

标签: mysql join filter where-clause between


【解决方案1】:

考虑以下几点:

SELECT product_id
     , MAX(CASE WHEN filter_id = 1 THEN value END) v
     , MAX(CASE WHEN filter_id = 2 THEN value END) w
  FROM product_filter
 GROUP
    BY product_id;

+------------+------+------+
| product_id | v    | w    |
+------------+------+------+
|          1 |   60 |   40 |
|          2 |  400 |   30 |
|          3 |   80 |   20 |
|          4 |   50 |  100 |
+------------+------+------+

因此,出于我们的目的,这可以重新排列为...

SELECT product_id
  FROM product_filter
 GROUP
    BY product_id
HAVING MAX(CASE WHEN filter_id = 1 THEN value END) BETWEEN 0 AND 200
   AND MAX(CASE WHEN filter_id = 2 THEN value END) BETWEEN 0 AND 50
   ;

+------------+
| product_id |
+------------+
|          1 |
|          3 |
+------------+

请注意,这不太可能比您(左)多次加入表格的想法更有效,但它更容易阅读。

【讨论】:

  • 谢谢。这是一个很好的答案。完美运行。
猜你喜欢
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
相关资源
最近更新 更多