具有交集的多对多SQL查询

具有交集的多对多SQL查询,sql,django,django-mptt,Sql,Django,Django Mptt,我正在使用的引擎盖下使用。(这暗示了我正在使用的db结构。) 我有一些产品: product -------- id | name 1 | Apple 2 | Orange 3 | Tomato 类别: categories ---------- id | name | parent | tree_id | level 1 | Type | null | 1 | 1 2 | Fruit

我正在使用的引擎盖下使用。(这暗示了我正在使用的db结构。)

我有一些产品:

product       
--------      
id | name     
1  | Apple    
2  | Orange   
3  | Tomato   
类别:

categories
----------
id | name       | parent | tree_id | level
1  | Type       | null   | 1       | 1
2  | Fruit      | 1      | 1       | 2
3  | Vegetable  | 1      | 1       | 2
4  | Color      | null   | 2       | 1
5  | Orange     | 4      | 2       | 2
6  | Red        | 4      | 2       | 2
7  | Green      | 4      | 2       | 2
8  | Dark green | 7      | 2       | 3
9  | Orange     | 4      | 2       | 2
这是一个单根树(节点也有字段
order
left
right
,但我认为这与此无关):

和M2M表:

product_categories
------------------
id | product_id | category_id
1  | 1          | 2
2  | 1          | 6
3  | 2          | 2
4  | 2          | 9
5  | 3          | 3
6  | 3          | 5
因此,我将所有类别放在一棵树中,但我可以按
tree\u id
对它们进行分组。 现在我想找到
水果
红色
橙色
的产品(这样就可以给苹果一个橙色)

我希望这个查询能给我想要的:

选择DISTINCT
“产品”“id”“产品”“名称”
从…起
“产品”
“产品”“id”“产品”“类别”“产品”“id”上的内部联接“产品”“类别”
哪里
('2'中的“产品类别”“类别id”)
和“产品类别”。('6','9')中的“类别id”)
但我没有得到任何结果

可以通过多次查询来实现,每棵树查询一次,然后查找交叉点,但我相信单次查询是可行的。

尝试以下方法:

SELECT DISTINCT 
"product"."id", "product"."name" 
FROM
"product" 
INNER JOIN "product_categories" ON ("product"."id" = "product_categories"."product_id") 
WHERE 
("product_categories"."category_id" IN ('6', '9'))
INTERSECT
SELECT DISTINCT 
"product"."id", "product"."name" 
FROM
"product" 
INNER JOIN "product_categories" ON ("product"."id" = "product_categories"."product_id") 
WHERE 
("product_categories"."category_id" IN ('2'))
试试这个:

SELECT DISTINCT 
"product"."id", "product"."name" 
FROM
"product" 
INNER JOIN "product_categories" ON ("product"."id" = "product_categories"."product_id") 
WHERE 
("product_categories"."category_id" IN ('6', '9'))
INTERSECT
SELECT DISTINCT 
"product"."id", "product"."name" 
FROM
"product" 
INNER JOIN "product_categories" ON ("product"."id" = "product_categories"."product_id") 
WHERE 
("product_categories"."category_id" IN ('2'))

请附上样品输出。这绝对是错误的:('2')中的产品类别是,并且。。。在('6','9')中。该值不能同时为2和6或2和9。请附上样本输出。这绝对是错误的:('2')中的产品类别是,并且。。。在('6','9')中。该值不能同时为2和6或2和9。