【发布时间】: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 <= 0 AND value => 200是...?filter_id的值,其中(filter_id = 1 AND ...) AND (filter_id = 2 AND ...)是...? PSminimal reproducible exampleHow to AskHelp center
标签: mysql join filter where-clause between