[英]How to transform this SQL query to query with GROUP BY and HAVING?
數據庫中有products 、 products_filters 、 filters_values表。
products_filters通過作為外鍵的 product_id 列對產品表的引用。
products_filters還通過 filter_value_id 列對filters_values表的引用,該列也是外鍵
當用戶選擇過濾器時,會形成 SQL 查詢,該查詢提取合適產品的所有 id。
例如,選擇的過濾器是:
性別:男、女
品牌:品牌1、品牌2、品牌3
它應該如何工作:
它需要 select 所有過濾器性別設置為男性或女性並且過濾器品牌設置為品牌 1 或品牌 2 或品牌 3 的產品。 但是,不得選擇僅在所選過濾類別之一中匹配的產品,無論是性別還是品牌。 它必須在所有選定的類別中進行匹配。
我認為 SQL 應該是這樣的:
SELECT product_id FROM products_filters WHERE
(filter_value_id = 1 OR filter_value_id = 2)
AND
(filter_value_id = 3 OR filter_value_id = 4 OR filter_value_id = 5)
其中 1 是男性,2 是女性,3 是品牌 1,4 是品牌 2,5 是品牌 3。
但是這個查詢不起作用。
在我之前的問題中,我回答說 GROUP BY 和 HAVING 可能會有所幫助。
問:如何使用 GROUP BY 和 HAVING 轉換上面的 SQL?
給定
drop table if exists t;
create table t(id int ,gender varchar(1), brand varchar(1));
insert into t values
(1,'m',1),(1,'f',2),(1,'m',3),(2,'f',1),(2,'f',2),(2,'f',3),
(3,'m',1),(4,'f',2);
具有不同的相關子查詢
select distinct id
from t
where
(select count(distinct gender) from t t1 where gender in('m','f') and t1.id = t.id) = 2 and
(select count(distinct brand) from t t1 where brand in(1,2,3) and t1.id = t.id) = 3
;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.002 sec)
SELECT product_id
FROM products_filters AS f1
JOIN products_filters AS f2 USING(product_id)
WHERE f1.filter_value_id IN (1,2)
AND f2.filter_value_id IN (3,4,5)
(我不認為GROUP BY...HAVING COUNT(*) = 2
對於這種情況是合理的。)
(EAV 模式設計很難處理。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.