我正在与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
这是具有单个根的树(节点也具有字段order
,left
,right
,但在这里我认为这无关紧要):
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
将它们分组。
现在,我想找到Fruits
且Red
或Orange
(以便让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'))
但是我没有结果。
可以通过多次查询(每棵树一次)然后寻找相交点来实现,但是我相信通过一次查询就可以做到。