我有具有以下简化架构的多个属性的实体:
实体:
- ID
属性:
- ID
- 姓名
实体属性:
- entity_id
- 属性ID
如果我想检索具有名为“男性”的属性的记录,我可以这样写:
SELECT * FROM Entity
INNER JOIN entity_attribute ON ...
INNER JOIN Attribute ON ...
WHERE Attribute.name = 'male'
如果我想检索属性名为“男”或“老师”的记录,我可以这样写:
SELECT * FROM Entity
INNER JOIN entity_attribute ON ...
INNER JOIN Attribute ON ...
WHERE Attribute.name = 'male' OR Attribute.name = 'teacher'
如果我想检索属性名为“男”和属性名为“老师”的记录,我可以这样写:
SELECT *, COUNT(*) AS cnt FROM Entity
INNER JOIN entity_attribute ON ...
INNER JOIN Attribute ON ...
WHERE Attribute.name = 'male' OR Attribute.name = 'teacher'
HAVING cnt = 2
现在是棘手的部分。我的查询需要包含and
并or
组合在多对多查询中。
例子:
哪些实体是[(具有属性'male')和(具有属性'teacher'或具有属性'gardener')和(具有属性'likes_apple'或具有属性'likes_orange'或具有属性' likes_cherry')]。
使用子查询可能是一种解决方案,但据我所知,这会很慢(~10000 个实体,~30 个属性,~15000 个实体属性)。什么可能是一个快速的解决方案?