2012-10-14 70 views
0

我有一个团队,学校和作业数据库。在选择作业后,学校(用户无论如何)都可以将一个小组添加到作业中,以便他们可以开始作业。 ER图如下所示: ER-diagram of the database 重要事项:即使数据库的设置建议不然,团队< - >分配关系是1:N。一个团队只能处理一项任务。这是通过ORM系统控制的。MySQL三维三角查询

现在这里有一个问题:数据库中有团队负责不属于他们学校的作业:学校选择作业,创建团队并删除他们的作业选择。我需要找到这种情况下的学校(身份证,姓名)。

到目前为止,我已经成功地拿出了最好的查询是:

SELECT schools.school_id, schools.name 
FROM schools 
LEFT JOIN teams ON schools.school_id = teams.school_id 
LEFT JOIN assignment_teams ON teams.team_id = assignment_teams.team_id 
LEFT JOIN assignment_schools ON schools.school_id = assignment_schools.school_id 
WHERE assignment_teams.assignment_id != assignment_schools.assignment_id; 

但当我手工检查的结果这是行不通的。我在找什么正确的查询?

回答

1

其中一个应该工作,但我不知道这是最快:

  1. SELECT school_id 
        FROM teams 
        INNER JOIN assignment_teams ON teams.team_id = assignment_teams.team_id 
        LEFT JOIN assignment_schools ON assignment_schools.school_id = teams.school_id AND assignment_schools.assignment_id = assignment_teams.assignment_id 
        WHERE assignment_schools.school_id IS NULL 
    
  2. SELECT school_id 
        FROM teams 
        INNER JOIN assignment_teams ON teams.team_id = assignment_teams.team_id 
        WHERE assignment_id NOT IN (
        SELECT assignment_id 
         FROM assignment_schools 
         WHERE assignment_schools.school_id = teams.school_id 
    ) 
    
  3. SELECT school_id 
        FROM teams 
        INNER JOIN assignment_teams ON teams.team_id = assignment_teams.team_id 
        WHERE NOT EXISTS (
        SELECT * 
         FROM assignment_schools 
         WHERE assignment_schools.school_id = teams.school_id 
         AND assignment_schools.assignment_id = assignment_teams.assignment_id 
    ) 
    
+0

对于每个查询的性能对比分析,请参阅[@ Quassnoi的博客文章](http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/)。 – eggyal

+0

@eggyal我已经阅读过一篇关于比较表现的文章(可能不是那篇文章),但我仍然更喜欢分析。 – Neil

+0

由于我只需要一次(用于分析当前情况),速度并不重要。我选择了最简单的查询(第一个),它的工作就像一个魅力。谢谢! –