2012-10-30 2 views
0

웹 사이트 (여행사)의 경우 성능 향상을 위해 노력하고 있습니다. 지금은 검색 모듈을 최적화하고 있습니다. 무엇보다도 목적지를 담고있는 셀렉트 박스를 최적화하고 싶습니다. 시스템에는 여러 목적지가 있지만 모든 목적지가 예약 가능한 숙박 시설이있는 것은 아닙니다. 그래서 적어도 적어도 1 개의 숙박 시설이있는 목적지리스트를 갖고 싶습니다. 대상 테이블 (tablename : geodata)에는 국가, 지역, 지역 및 도시의 네 가지 유형이 있습니다. 부적절한 개발 (일종의 *)으로 인해 숙박 테이블에는 4 개의 외래 키 (fk_country, fk_area, fk_region 및 fk_city)가 있습니다. * 기능이 개발 될 때마다 성장 및 들어오는 요구 사항으로 인해.왼쪽 조인의 열 값을 기준으로 행 수 계산

IF 문을 기반으로 한 왼쪽 결합으로 다음을 시도했습니다. 그러나이 쿼리는 작업량의 절반 만 수행합니다. 나는 주어진 국가, 지역, 지역 또는 도시에 의한 숙박 시설의 수에 가장 관심이 있습니다. 이 순간 나는 총 숙박 시설 수만 얻는다. 특정 위치 유형별 조정 수를 정확하게 얻기 위해이 쿼리를 조정하는 방법.

내 쿼리 :

SELECT  geodata.id, 
      geodata.type, 
      COUNT(accommodation.id) AS count_accommodations 
FROM  geodata 
LEFT JOIN accommodation 
ON   IF(geodata.type = 'Country', accommodation.fk_country, 
       IF(geodata.type = 'Area', accommodation.fk_area, 
        IF(geodata.type = 'Region', accommodation.fk_region, accommodation.fk_city) 
       ) 
      ) 
GROUP BY geodata.id 
HAVING  count_accommodations > 0 

전류 출력 :

|id|type |count_accommodations| 
--------------------------------- 
| 1|Country|     2| 
| 2|Area |     2| 
| 3|Area |     2| 

예상 출력

|id|type |count_accommodations| 
--------------------------------- 
| 1|Country|     2| 
| 2|Area |     1| 
| 3|Area |     1| 

어떤 도움이 크게 감사합니다.

답변

1

가입 조건이 없기 때문에 작동하지 않습니다. 당신이하는 일은 외래 키 (fk_country, fk_area, ...)를 평가하는 것이지, 당신은 아무 데서도 그것을 사용하지 않는다.

... 
left join accommodation 
on (... fk_...) = geodata.??? 
group by geodata.id 
... 
+0

하하, 어리석은 나를! 고마워요 ... 중첩 된 IF 때문에 그 부분을 완전히 간과하고있었습니다. +1이 수락되었습니다. 나를 날카롭게 유지해 주셔서 고마워.) – Ben

관련 문제