具有交集的多对多SQL查询
我正在使用的引擎盖下使用。(这暗示了我正在使用的db结构。) 我有一些产品:具有交集的多对多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
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。