2012-10-14 2 views
0

팀, 학교 및 과제 데이터베이스가 있습니다. 과제를 선택하면 학교 (사용자는 어쨌든) 팀이 과제에 팀을 추가하여 과제 수행을 시작할 수 있습니다. ER- 다이어그램은 다음과 같습니다. ER-diagram of the database 중요 사항 : 데이터베이스의 설정에서 다르게 제안하더라도 팀 < -> 할당 관계는 1 : N입니다. 팀은 하나의 과제에만 작업 할 수 있습니다. 이것은 ORM 시스템을 통해 제어됩니다.MySQL 삼중 삼각형 쿼리

이제 캐치가 있습니다. 학교에 속하지 않은 과제를 수행하는 팀이 데이터베이스에 있습니다. 학교는 과제를 선택하고 팀을 만들고 과제 선택을 제거했습니다. 이 경우에 해당하는 학교 (ID, 이름)를 찾아야합니다.

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

현재 상황을 분석하기 위해 한 번만 필요하므로 속도는 중요하지 않습니다. 나는 가장 간단한 쿼리 (첫 번째 쿼리)를 선택했으며 매력처럼 작동했습니다. 감사! –