2014-05-07 66 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; 
相關問題