获取没有特定类别的任何产品的类别

时间:2017-06-22 18:47:12

标签: mysql sql mysqli

我正在尝试编写一个sql查询来获取没有特定类别的任何产品的类别。假设我有a,b,c,d,e类别,每个类别都有一些产品。现在我需要获得所有不包含a类产品的类别。

分类表:

id  name
1   A
2   B
3   C
4   D
5   E

category_products表:

product_id   category_id
1            1
1            2
2            3
2            1
4            3
3            2
3            4
3            5
4            5

我使用的查询在下面给出了B,C,D,E(不是预期的)

SELECT DISTINCT c.name FROM category_products AS p
LEFT JOIN categories AS c ON c.id = p.category_id
WHERE p.product_id NOT IN (SELECT DISTINCT product_id FROM category_products where category_id = 1)
ORDER BY c.name

但我需要将结果分类为D类,E类,不包含A类产品。 我将非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

您需要再进行一次内部查询,例如:

SELECT name
FROM categories 
where id NOT IN (
    SELECT DISTINCT category_id 
    FROM category_products WHERE 
    product_id IN (
        SELECT product_id FROM category_products WHERE category_id = 1
    )
);

这将返回D和E.

这里是 SQL Fiddle

答案 1 :(得分:0)

您应该使用内部联接

  select distinct  t2.name
  from category_products t1 
  inner join Categories t2 on t2.id = t1.category_id
  where t1.product_id not in 
   (select p.product_id
   from category_products p
   inner join Categories c on c.id = p.category_id
   where c.name ='A') 

答案 2 :(得分:0)

我倾向于使用group byhaving

执行此操作
select pc.product_id
from category_products pc join
     categories c
     on c.id = pc.category_id
group by pc.product_id
having sum(c.name = 'A') = 0;