2016-04-25 82 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;