我正在尝试编写一个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类产品。 我将非常感谢你的帮助。
答案 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 by
和having
:
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;