2014-05-07 41 views
1

我不确定我是否正确表达了这个问题,请随时纠正我。以下是他们的数据表:如何选择在其他表中具有全部或无相应值的行?

product  category     category_product 
-------  --------     ---------------- 
id_product  id_category active  id_category id_product 
1    1   1   1   1 
2    2   1   2   1 
3    3   0   1   2 
       4   0   2   2 
             3   2 
             3   3 
             4   3 

我只需要选择那些产品,其中有所有类别为无效。 例如:

  • 产品1是好的,因为它属于活性类别(12)。
  • 产品2是良好的,因为它具有至少一个活性类别(12; 3 - 不活动)
  • 产品3必须选择,因为它的所有类别是不活动的(34)。

我有以下查询,这显然是不正确的,因为它会选择这两种产品:23

SELECT p.id_product 
FROM product p 
JOIN category_product cp 
    ON p.id_product = cp.id_product 
JOIN category c 
    ON c.id_category = cp.id_category 
WHERE 
    c.active = 0; 

这里是SQL小提琴:http://sqlfiddle.com/#!2/909dd/2/0

我怎样才能解决这个问题?

回答

0

考虑以下几点:

SELECT p.* 
    , COUNT(*) 
    , SUM(c.active = 1) active 
    , SUM(c.active = 0) inactive 
    FROM product p 
    JOIN category_product cp 
    ON cp.id_product = p.id_product 
    JOIN category c 
    ON c.id_category = cp.id_category 
GROUP 
    BY p.id_product; 

+------------+----------+--------+----------+ 
| id_product | COUNT(*) | active | inactive | 
+------------+----------+--------+----------+ 
|   1 |  2 |  2 |  0 | 
|   2 |  3 |  2 |  1 | 
|   3 |  2 |  0 |  2 | 
+------------+----------+--------+----------+ 

http://sqlfiddle.com/#!2/909dd/55

此问题的最后部分已作为练习留给读者使用

+0

这是一个很好的答案!我比其他人更喜欢它,因为它不包含嵌套的'select',并提供有关产品的额外信息。 –

3

这样您可以选择没有活动类别的产品。

SELECT p.id_product 
FROM product p 
WHERE NOT EXISTS  
    (SELECT * FROM 
    category_product cp 
    INNER JOIN category c ON c.id_category = cp.id_category 
    WHERE p.id_product = cp.id_product AND c.active = 1); 

SQL Fiddle

0

这是我所得到的,而试图...道歉,如果任何事情都是错误的

set @count:=0; 
select a.id_product,a.times from 
    (SELECT count(p.id_product)times, p.id_product, c.active, 
       if(c.active!=0, @count:[email protected]+1, @count:=0) x 
    From category_product cp 
     join product p 
       on (p.id_product = cp.id_product) 
     join category c 
       on(c.id_category = cp.id_category) 
    group by id_product)a 
where a.x=0; 
相关问题