2017-05-09 28 views
0

我有一個categories表(CATEGORY_ID,CATEGORY_NAME)與下列類型類別:過濾產品所需的類ID和OR類別ID的

Website1 
Website2 
Product_type1 
Product_type2 
red 
blue 
green 
wood 
plastic 
metal 

一個products表(PROD_ID,PROD_NAME ...等)和鏈接表product_cateogries(id,prod_id,category_id)。

我試圖運行查詢來過濾這些值,但某些類別是必需的,有些是X或X.例如,我希望能夠選擇所有Website1Product_type2產品,它們是紅色或藍色。

我的第一個想法是,我可以IN (Product_type2_id, Website2_id, red_id, blue_id)但這使得Product_type2_idWebsite2_id可選時,他們應該是必需的。並且使用GROUP BY prod_id HAVING count(distinct category_id) = 4)可確保在產品只能有一種顏色時找到所有colours_id。是否需要某個子查詢?

表:

類別:

id (int) 
category_name (varchar) 

PRODUCT_CATEGORY:

id (int) 
product_id, (int) 
category_id (int) 

產品:

prod_id (int) 
prod_image 
prod_price 

SQL小提琴:

http://sqlfiddle.com/#!9/32ec8

UPDATE:

下面的查詢現在不正是我想要的東西,看來雖然有點亂,想應該有一個更清潔的方式?

SELECT p.* 
FROM products p 
LEFT JOIN product_category pc_w1 ON pc_w1.product_id = p.prod_id AND pc_w1.category_id = 3 
LEFT JOIN product_category pc_pt2 ON pc_pt2.product_id = p.prod_id AND pc_pt2.category_id = 1 
LEFT JOIN product_category pc_rb ON pc_rb.product_id = p.prod_id AND pc_rb.category_id IN (11) 
LEFT JOIN product_category pc_rb1 ON pc_rb1.product_id = p.prod_id AND pc_rb1.category_id IN (1,12) 
WHERE 
    pc_w1.product_id IS NOT NULL AND pc_pt2.product_id IS NOT NULL AND 
    (
    pc_rb.product_id IS NOT NULL AND 
    pc_rb1.product_id IS NOT NULL 
) 
GROUP BY p.prod_id 
+0

顯示錶的模式。另外,您如何知道哪些是必需的?哪些是可選的?信息是在表中,還是隻是查詢的一部分? –

+0

我看不出在哪裏打印出所有的模式,但我已經添加了所有你需要的數據。 – john

+0

其餘的問題呢? –

回答

1

僅在使用連接

SELECT p.* 
FROM products p 
LEFT JOIN product_category pc_w1 ON 
    pc_w1.product_id = p.prod_id AND pc_w1.category_id = 3 
LEFT JOIN product_category pc_pt2 ON 
    pc_pt2.product_id = p.prod_id AND pc_pt2.category_id = 7 
LEFT JOIN product_category pc_rb ON 
    pc_rb.product_id = p.prod_id AND pc_rb.category_id IN (9,13) -- black/blue 
WHERE 
    pc_w1.product_id IS NOT NULL OR 
    (
    pc_pt2.product_id IS NOT NULL AND 
    pc_rb.product_id IS NOT NULL 
) 
GROUP BY p.prod_id 

編輯:我看你加小提琴所以這裏是我的工作示例http://sqlfiddle.com/#!9/837872/4

+0

哪裏是建議在每個查詢結尾包含一個「GROUP BY」的手動/教程/資源? – Strawberry

+0

@Strawberry推薦? OP想要產品清單並且沒有「group by」他將通過以上查詢獲得複製產品 – Peter

+0

迄今爲止最好返回不確定且可能無意義的結果。 – Strawberry

相關問題