2017-10-19 68 views
0

我有一個表結構如下:SQL查詢比較不同行中的值

| product_id | category_id | 
| 1   | 1   | 
| 1   | 2   | 
| 2   | 1   | 
| 2   | 2   | 
| 2   | 3   | 
| 3   | 1   | 
| 3   | 2   | 
| 3   | 3   | 
| 3   | 4   | 

所以:

  • 製品1是在第1類和2
  • 製品2是第1類,2和3
  • 產品3處於類別1,2,3和4中
  • 等等

我如何構造一個SQL查詢,可以檢索屬於product_ids列表:

  1. 類別4
  2. 或類別2而不是3類或4
  3. 或類別1,但不第2類

我曾嘗試:

SELECT * 
FROM `catalog_category_product` 
WHERE category_id = 1 
OR (category_id = 2 AND category_id NOT IN (3,4)) 
OR (category_id = 1 AND category_id NOT IN (2,3)) 
GROUP BY product_id 

......但這並不像希望的那樣工作。

在此先感謝非常

薩拉

+0

您需要將表加入自身,並針對表的第二個實例檢查第一個實例的第2類條件和「但不是第3或第4類」。 – axiac

回答

4

您可以使用group byhaving

select product_id 
from t 
group by product_id 
having (sum(category_id = 4) > 0) 
     or 
     (sum(category_id = 2) > 0 and 
     sum(category_id in (3, 4)) = 0 
     ) 
     or 
     (sum(category_id = 1) > 0 and 
     sum(category_id = 2) = 0 
     ); 

表達sum(category_id = 4)計數與每個產品類別4的行數。 > 0是說至少有一個這樣的行存在。 = 0是說沒有這樣的行。

+0

真棒解決方案! –

+0

謝謝,我會試試看,第7行應該讀''或'而不是')和'? – Sarah

+0

@Sarah。 。 。是的,謝謝。 –

1

試試這個使用IN謂詞:

SELECT DISTINCT product_id 
FROM table1 
WHERE category_id = 4 
    OR (category_id = 2 
     AND 
     product_id IN(SELECT product_id from table1 WHERE category_id IN(3,4))) 
    OR (category_id = 1 
     AND 
     product_id IN(SELECT product_id from table1 WHERE category_id != 2));