3

我有具有以下简化架构的多个属性的实体:

实体:

  • 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

现在是棘手的部分。我的查询需要包含andor组合在多对多查询中。

例子:

哪些实体是[(具有属性'male')和(具有属性'teacher'或具有属性'gardener')和(具有属性'likes_apple'或具有属性'likes_orange'或具有属性' likes_cherry')]。

使用子查询可能是一种解决方案,但据我所知,这会很慢(~10000 个实体,~30 个属性,~15000 个实体属性)。什么可能是一个快速的解决方案?

4

1 回答 1

0

好吧,你可以对它们进行 3 个查询和一个联合,这将是最快(最简单)的方式

如果你想要一个快速的方法......使用exists与子查询,exists的想法是它在第一个匹配的项目上返回true......所以你可以避免这种方式内部连接和多个where子句

于 2012-09-01T23:58:10.147 回答