2012-02-21 5 views
3

내가 원하는 쿼리를 만드는 데 아무 문제가 있습니다.mysql join and count

DB는 위치와하는 것입니다,

  • t_location 관련된 다음과 같은 테이블이 있습니다 - 포함 사항 목록. 필드 t_location_zipcodet_location_id_location
  • t_zipcodecity - 조인 테이블 단지 t_zipcodecity_zipcode t_zipcodecity_id_city
  • t_city-t_city_id_city
  • t_citystate와 도시 목록 - 테이블, t_citystate_id_city, t_citystate_id_state
  • t_state 가입 - t_state_id_state과 국가의 목록을

처음에이 쿼리를 사용하여 위치가있는 상태 목록을 얻으려고했습니다 :

SELECT DISTINCT `t_state_id_state` 
     , `t_state_name_full` 
    FROM (`t_state`) 
LEFT JOIN `t_citystate` ON `t_state_id_state` = `t_citystate_id_state` 
LEFT JOIN `t_city` ON `t_citystate_id_state` = `t_city_id_city` 
LEFT JOIN `t_zipcodecity` ON `t_city_id_city` = `t_zipcodecity_id_city` 
LEFT JOIN `t_location` ON `t_zipcodecity_zipcode` = `t_location_zipcode` 
ORDER BY `t_state_name_full` asc ­ 

잘 작동합니다.

이제 내가 싫어하는 것은 각 주마다 위치의 수를 얻는 것입니다. 이 쿼리에서이 작업을 수행 할 수 있는지 또는 다른 작업이 필요하면 도움이 필요한지 알 수 없습니다.

+0

'City'와 'State'사이에 다 대다 관계가 있고 'City'와 'Location'이 다 대다 관계라는 점을 올바르게 이해하고 있습니까? –

답변

0
SELECT t_state_id_state 
     , t_state_name_full 
     , COUNT(DISTINCT t_location_id_location) AS locations_number 

    FROM 
     t_state 
    LEFT JOIN 
     t_citystate ON t_state_id_state = t_citystate_id_state 
    LEFT JOIN 
     t_city ON t_citystate_id_state = t_city_id_city 
    LEFT JOIN 
     t_zipcodecity ON t_city_id_city = t_zipcodecity_id_city 
    LEFT JOIN 
     t_location ON t_zipcodecity_zipcode = t_location_zipcode 

    GROUP BY t_state_id_state 

    ORDER BY t_state_name_full ASC ­ 
+0

좋아 보이는 thats, 왼쪽 조인과 내 잘못, 나는 처음에 내가 그들을 사용하는 이유는 모든 주를 얻으려고했다. 하지만 내부 조인을 사용하도록 변경했습니다. 'code' –

1

에 의해 개수 및 그룹을 사용할 수 있습니다. 이런 식으로 뭔가 : 좋은 찾고

SELECT DISTINCT `t_state_id_state` 
      , `t_state_name_full` 
      , COUNT(*) 
     FROM (`t_state`) 
LEFT JOIN `t_citystate` ON `t_state_id_state` = `t_citystate_id_state` 
LEFT JOIN `t_city` ON `t_citystate_id_state` = `t_city_id_city` 
LEFT JOIN `t_zipcodecity` ON `t_city_id_city` = `t_zipcodecity_id_city` 
LEFT JOIN `t_location` ON `t_zipcodecity_zipcode` = `t_location_zipcode` 
    GROUP BY `t_state_id_state` , `t_state_name_full` 
    ORDER BY `t_state_name_full` asc 
+0

정확하지는 않지만 결과는 틀 렸습니다. 전체 합계가 너무 많아서 상태 당 위치 수가 너무 많습니다 (너무 높거나 약간 너무 큼) –

+0

나는 모든 LEFT JOINS를 제거하고 카운트를 얻음으로써 시작하는 것이 좋습니다. 수정 한 다음 한 번에 하나씩 추가하십시오. 나쁜 데이터 또는 기대하지 않았던 데이터가있을 수 있습니다. 예를 들어 한 도시에 대해 하나 이상의 citystate_id가 있습니다. – northpole

+0

당신이 원칙적으로 의미하는 것을 이해하지만 .... 그냥 선택 DISTINCT't_state_id_state','t_state_name_full', COUNT (*) FROM ('t_state')을 사용하면 - 1 상태와 총 상태 수를 얻습니다. –

0

좋아 이잖아, 왼쪽 내 나쁜, 난 처음에 내가 그들을 사용하는 이유는 모든 상태를 얻으려고 노력했다 조인. 하지만 내부 조인을 사용하도록 변경했습니다.

SELECT t_state_id_state, 
t_state_name_full, 
COUNT(DISTINCT t_location_id_location) AS locations_number 
FROM t_state 
INNER JOIN t_citystate ON t_citystate_id_state = t_state_id_state 
INNER JOIN t_city ON t_city_id_city = t_citystate_id_city 
INNER JOIN t_zipcodecity ON t_zipcodecity_id_city = t_city_id_city 
INNER JOIN t_location ON t_location_zipcode = t_zipcodecity_zipcode 
GROUP BY t_state_id_state 
ORDER BY t_state_name_full ASC 

그러면 실제로 결과가 좋을 것 같습니다.