2011-10-13 3 views
-1
select 
    b.entry_id, 
    b.assign_id, 
    a.profile_type, 
    a.profile_id, 
    a.profile_name, 
    a.profile_status, 
    b.entry_type, 
    b.assign_id, 
    c.chapter_name, 
    d.section_name, 
    h.group_name, 
    i.programme_name, 
    k.subjectprogramme_name, 
    j.masterprogramme_name, 
    l.developmentprogramme_name 
from profile_master a 
left join profile_assign b on (a.profile_id = b.profile_id) 
left join chapter_master c 
     on (b.entry_id = c.chapter_id and b.entry_type='chapter') 
left join section_master d 
     on (b.entry_id = d.section_id and b.entry_type='section') 
left join group_master h 
     on (b.entry_id = h.group_id and b.entry_type='Group' 
      and h.year_id='".$this->year."') 
left join programme_master i 
     on (b.entry_id = i.programme_id and b.entry_type='Programme' 
      and i.year_id='".$this->year."') 
left join subjectprogramme_master k 
     on (b.entry_id = k.subjectprogramme_id and b.entry_type='subjectProgramme' 
      and k.year_id='".$this->year."') 
left join masterprogramme_master j 
     on (b.entry_id = j.masterprogramme_id and b.entry_type='masterProgramme' 
      and j.year_id='".$this->year."') 
left join developmentprogramme_master l 
     on (b.entry_id = l.developmentprogramme_id 
      and b.entry_type='developmentProgramme') 
+1

정말로 모든 외부 조인이 필요합니까? 일반적으로 조인 기준이 일치하지 않으면 데이터가 거의 필요하지 않습니다. – 0xCAFEBABE

+0

profile_assign 테이블의 profile_id에 인덱스를 만들면 spped가 증가합니다. 이것이 올바른 방법입니다. – user993516

답변

0

1) 왼쪽 조인에서 코드 변환을 제거하십시오. 필터링

2)가 UNION 또는 separetely 각 엔티티 7 개 쿼리 (추측)에 대한 조항은 귀하의 경우

0

이 데이터베이스에 직접 액세스하지 않고 대답하기 어려운 질문이다 훨씬 더 좋을 것 WHERE 때문에, 사용 나는 일반적인 대답을 시도 할 것이다!

  • 이 쿼리에서 "설명"을 사용하면 MySQL에서 일부 인덱스를 제안하는지 확인할 수 있습니다. 의심 할 여지없이 몇 가지 열을 여러 번 액세스하기 때문에 몇 가지를 제안 할 것이고 때로는 색인이 가장 느린 속도로 향상되기도합니다. OUTER JOIN
  • $this->year에 대해 많은 수표를 사용하고 있으므로 몇 가지 복합 색인을 제안합니다. 예

    • 이 쿼리가 실행되는 경우 : programme_id year_id이 같은 인덱스 물론

    에 모두, 예를 들어, 당신은 출력을 사용하는 방법에 따라 다릅니다 수있는 솔루션이있다 자주 대기하는 사용자에게는 문제가 될만큼 자주 발생하지만 문제가되지 않는 대기 시간은 드물게 발생합니다 (예 : 지난 밤 데이터를 기반으로 실행하는 것이 좋습니다). 하룻밤 사이에 실행하고 결과를 캐싱 할 수 있습니다.

0

당신은 정말 단 조건이 전달 될 때, 내가 지금처럼 부속 선택을하는 것이 좋습니다 가입 않습니다

SELECT 
    b.entry_id, 
    b.assign_id, 
    a.profile_type, 
    a.profile_id, 
    a.profile_name, 
    a.profile_status, 
    b.entry_type, 
    b.assign_id, 
    CASE b.entry_type 
    WHEN 'chapter' THEN SELECT(c.chapter_name FROM c WHERE b.entry_id = c.chapter_id) 
    WHEN 'section' THEN SELECT(d.section_name FROM d WHERE b.entry_id = d.section_id) 
    WHEN .... 
    END as name 
from profile_master a 
left join profile_assign b on (a.profile_id = b.profile_id) 

당신이 출력은 동일하게 가지고 주장하는 경우에, 당신이 선택을 포장 할 필요가 바깥 쪽을 다음과 같이 선택하십시오 :

SELECT 
    entry_id, assign_id, ...... 
    , CASE entry_type WHEN 'chapter' THEN name ELSE null END as chapter_name 
    , CASE entry_type WHEN 'section' THEN name ELSE null END as section_name 
FROM 
    (select statement like above) sub 
관련 문제