MySQL - Tricky Many2Many Query

时间:2012-09-01 23:44:21

标签: mysql hibernate doctrine-orm

我的实体具有多个属性,具有以下简化模式:

实体:

  • ID

属性:

  • ID
  • 名称

entity_attribute:

  • ENTITY_ID
  • attribute_id

如果我想要检索具有名为“male”属性的记录,我可以写:

SELECT * FROM Entity
INNER JOIN entity_attribute ON ...
INNER JOIN Attribute ON ...
WHERE Attribute.name = 'male'  

如果我想检索具有名为“male”或“teacher”属性的记录,我可以写:

SELECT * FROM Entity
INNER JOIN entity_attribute ON ...
INNER JOIN Attribute ON ...
WHERE Attribute.name = 'male'  OR Attribute.name = 'teacher'

如果我想检索具有名为“male”的属性并且具有名为“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

现在是棘手的部分。我的查询需要在manytomany查询中包含andor

实施例

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

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

1 个答案:

答案 0 :(得分:0)

你可以做3个查询和联合,这将是最快(最简单)的方式

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