如何选择在另一个表中具有全部或没有相应值的行?

时间:2014-05-07 06:54:37

标签: mysql sql

我不确定我是否正确地表达了这个问题,所以请随时纠正我。以下是包含其数据的表格:

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

我该如何解决这个问题?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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:=@count+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;

答案 2 :(得分: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

这个问题的最后一部分留给读者练习