簡體   English   中英

如何將此 SQL 查詢轉換為使用 GROUP BY 和 HAVING 查詢?

[英]How to transform this SQL query to query with GROUP BY and HAVING?

數據庫中有productsproducts_filtersfilters_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM