带交集的多对多SQL查询

时间:2018-09-14 11:30:03

标签: sql django django-mptt

我正在与django-categories一起工作,后者在引擎盖下使用了django-mptt。 (这暗示我正在使用的数据库结构。)

我有一些产品:

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

这是具有单个根的树(节点也具有字段orderleftright,但在这里我认为这无关紧要):

root/
├── Type/
│   ├── Fruit
│   ├── Vegetable
└── Color/
    ├── Red
    ├── Green
    |   └── Dark green
    └── Orange

和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_id将它们分组。 现在,我想找到FruitsRedOrange(以便让Apple变成Orange)的产品

我希望查询能给我我想要的东西

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') 
AND "product_categories"."category_id" IN ('6', '9'))

但是我没有结果。

可以通过多次查询(每棵树一次)然后寻找相交点来实现,但是我相信通过一次查询就可以做到。

0 个答案:

没有答案