2016-04-25 86 views
1

我有2個表。MySQL需要子選擇或臨時表

First table - products 
products_id | quantity 

1001,1 
1002,2 
1003,5 
1004,4 


Second table - products_catalog 
products_catalog_id | products_id | partner_channel |active_status 

1,1001,amazon,0 
2,1001,ebay,0 
3,1001,zalando,1 
4,1002,amazon,1 
5,1002,ebay,0 
6,1003,amazon,1 
7,1003,ebay,1 
8,1003,zalando,1 
9,1004,amazon,0 
10,1004,ebay,0 
11,1004,zalando,0 

我想有產品ID與所述條件的結果,如果該產品沒有激活任何夥伴信道(active_status = 0) 我用WHERE濾波器是這樣的:

SELECT p.products_id, pc.partner_channel, pc.active_status 
    FROM products p 
     LEFT JOIN products_catalog pc ON pc.products_id=p.products_id  
    WHERE pc.active_status='0' 
GROUP BY p.products_id ORDER BY p.products_id; 

WHERE active_status = 0,但結果卻是這樣的:

products_id | partner_channel | active_status 
1001,amazon,0 
1002,ebay,0 
1004,amazon,0 

我希望能有結果表同類產品:

products_id | partner_channel | active_status 
1004,amazon,0 

因爲有active_status = 0

所有partner_channel只有這個產品ID(1004),我想我錯過了一些在WHERE過濾器,但沒有關於任何線索。也許我應該在LEFT JOIN到products_catalog時使用子查詢?

任何幫助將不勝感激。

謝謝。

+0

你可以試一試'GROUP BY pc.products_id',你能不能做一個小提琴...... –

回答

1

你必須放置一個條件是這樣的HAVING子句中:

SELECT products_id 
FROM products_catalog 
GROUP BY products_id 
HAVING SUM(active_status <> 0) = 0; 

該查詢返回有active_status = 0所有​​值所有partner_channel他們都涉及到。

然後可以使用上面的查詢作爲派生表加入回到原來的表,以獲得其餘字段:

SELECT p.*, pc.* 
FROM products p 
JOIN products_catalog pc ON pc.products_id=p.products_id 
JOIN (
    SELECT products_id 
    FROM products_catalog 
    GROUP BY products_id 
    HAVING SUM(active_status <> 0) = 0 
) AS g ON g.products_id = p.products_id 
ORDER BY p.products_id 

Demo here

+0

這是行得通的!非常感謝@Giorgios Betsos! –

0

試試這個代碼

SELECT p.products_id, pc.partner_channel, pc.active_status 
    FROM products p 
     LEFT JOIN products_catalog pc ON pc.products_id=p.products_id  
    WHERE pc.active_status='0' 
GROUP BY p.products_id ORDER BY p.products_id DESC; 
+0

這看起來像從我的答案複製/粘貼。這在這裏是不允許的。 –

2

使用具有功能。

SELECT p.products_id, ANY_VALUE(pc.partner_channel), ANY_VALUE(pc.active_status) 
    FROM products p 
     LEFT JOIN products_catalog pc ON pc.products_id=p.products_id 
GROUP BY p.products_id 
having sum(pc.active_status)=0 
    ORDER BY p.products_id;