SQL Query比较不同行中的值

时间:2017-10-19 11:33:39

标签: mysql

我的表格结构如下:

| 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
  • 等...

如何构建可以检索以下内容的product_id列表的SQL查询:

  1. 第4类
  2. 或类别2但不属于第3类或第4类
  3. OR类别1但不属于第2类
  4. 我试过了:

    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
    

    ......但这并不像希望的那样有效。

    非常感谢

    萨拉

2 个答案:

答案 0 :(得分: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表示没有这样的行。

答案 1 :(得分: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));