【问题标题】:MySQL - Tricky Many2Many QueryMySQL - 棘手的 Many2Many 查询
【发布时间】:2012-09-01 23:44:21
【问题描述】:

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

实体:

  • 身份证

属性:

  • 身份证
  • 姓名

实体属性:

  • entity_id
  • attribute_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 组合在 manytomany 查询中。

示例:

哪些实体是[(具有属性“男性”)和(具有属性“老师”或具有属性“园丁”)和(具有属性“likes_apple”或具有属性“likes_orange”或具有属性'likes_cherry')]。

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

【问题讨论】:

    标签: mysql hibernate doctrine-orm


    【解决方案1】:

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

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

    【讨论】:

    • 你能说得更具体点吗?工会的这 3 个查询是什么?
    • 我明天有更多的时间,然后我会用例子回答你的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多