2011-03-21 9 views
1

인사말! 여러 테이블을 참조하는 쿼리를 만드는 데 어려움을 겪고 있습니다. 나는 SQL에 익숙하지 않으며 조인은 나를 혼란스럽게하고있다. 나는 구글에 관해 망연자실했다. 그리고 주변에서 검색하고 난 후에 나는 내가되고 싶은 곳에 나를 더 가까이 가게했던 Joining tables in SQL를 발견했다! 내가 만든 쿼리는 내가 원하는 것을 수행하지 않습니다.MySQL 다중 테이블 쿼리

disp_profile 
    disp_id* name  address  zip 
    0001  Profile1 SomeAddress1 11111 
    0002  Profile2 SomeAddress2 22222 
    0003  Profile3 SomeAddress3 33333 

zipcode 
    zip_code* state  city   county 
    11111  CA  City1  County1 
    22222  WA  City2  County2 
    33333  NV  City3  County3 

은 내가 무엇을 시도하고하는 우편 번호에서시, 주, 카운티을 잡고있을 때 (가변 국가에 의해 필터링)을 zipcode.zip = disp_profile.zip : 나는 두 개의 테이블이있다. 같은 이상적으로 반환 뭔가 : 나는 알고 있어요

dispId dispName  dispAddress  dispZip zipState zipCounty zipCity zipCode 
    001  Profile1  SomeAddress1 11111  CA   County1  City1 11111 
or 
    002  Profile2  SomeAddress2 22222  WA   County2  City2 22222 


SELECT 
    dp.disp_id AS dispId, dp.name AS dispName, dp.address1 AS dispAddress1, dp.zip AS dispZip, zc.state AS zipState, zc.county AS zipCounty, zc.city AS zipCity, zc.zip_code AS zipCode 
FROM 
    disp_profile dp 
INNER JOIN 
    zipcodes zc 
ON 
    dp.zip = zc.zip_code 
WHERE 
    dp.state = 'CA' 

이 이것에 대해 이동하는 가장 좋은 방법하지 않을 수 있습니다하지만 난 그게 더 각 항목에 대한 중복 정보 대 개별적으로 물건을 저장하는 생각. disp_profile의 데이터 세트는 약 1000 개의 레코드이고 zip_codes는 약 30,000 개입니다. 하위 쿼리를 사용하면이 작업을 쉽게 수행 할 수 있습니까? 시간 내 줘서 고마워!

+0

출력이 양호한 것 같습니다. 오류가 무엇인지 그리고 결과로 원하는 것이 무엇인지 잘 모르겠습니다. – rkg

답변

1

아니요, 괜찮습니다.. 이 부분은 인 경우 여기에 하위 쿼리를 사용할 필요가 없도록 이 조인 한 것입니다. 가능하면 이 더 좋게 실행되지 않을 것입니다. (MySQL Query Optimizer는 내부적으로 조인으로 변환 할 수도 있습니다).

당신은 속도에 대해 걱정하는 경우 : MySQL이 무엇을하고 있는지 확인하기 위해 SELECT 문 앞에 단어 "EXPLAIN"를 넣어 : 당신의 문이 실행되는 방식

EXPLAIN SELECT 
    dp.disp_id AS dispId, dp.name AS dispName, dp.address1 AS dispAddress1, dp.zip AS dispZip, zc.state AS zipState, zc.county AS zipCounty, zc.city AS zipCity, zc.zip_code AS zipCode 
FROM 
    disp_profile dp 
INNER JOIN 
    zipcodes zc 
ON 
    dp.zip = zc.zip_code 
WHERE 
    dp.state = 'CA' 

그것은 당신을 말할 것이다. 해석을 돕기를 원한다면 출력을 여기에 붙여 넣으십시오.

+0

입력 해 주셔서 감사합니다. 쿼리가 정확하지만 내 우편 번호 데이터가 불완전하다는 문제가 있습니다. 신기한 실수! 시간 내 주셔서 대단히 감사합니다! – Antiartificial

0

적어도 언뜻보기에 나에게는 괜찮은 것처럼 보입니다. 나는의 구식 방법을 선호 :

select dp.disp_id AS dispId, 
     dp.name AS dispName, 
     dp.address1 AS dispAddress1, 
     zc.state AS zipState, 
     zc.county AS zipCounty, 
     zc.city AS zipCity, 
     zc.zip_code AS zipCode 
from disp_profile dp, 
     zipcodes zc 
where dp.state = 'CA' 
    and dp.zip = zc.zip_code 

을하지만 그건 단지 스타일의 문제 (매우 지능적인 최적화와 DBMS를 사용하여 - MySQL은 선택의 내 DBMS의 일치인지, 나는 (언급 할 수 그러나 나는 그것을 의심한다)). 단지 우편 번호의 하나를 얻을 수

내가 만든 (어느 아마 당신은해야한다)이 한 변화이다. 참여가 동일하기 때문에 필드를 dpzc에서 모두 가져 오는 것은 불필요합니다.

+0

재미있게,이 JOIN 스타일을 사용하면 [이전 구문을 사용하여 강의합니다.] (http://stackoverflow.com/questions/5291116/selecting-with-two-references-to-same-table/5291142#5291142);) – Konerak

+0

이전 구문을 더 쉽게 이해할 수 있지만 실제로는 오른쪽, 바깥 쪽, 거꾸로 된, 약간 비스듬한 조인을 모두 사용해야했던 횟수 때문일 수 있습니다. 한 발의 손가락에 의지 할 수 있습니다. :-) – paxdiablo

+0

Paxdiablo, 솔루션에 감사드립니다. 그것은 작동하지만 실수는 완전히 내 목적에 달려 있습니다. 내가 가진 우편 번호 데이터가 불완전하고 펑키 한 동작을 설명합니다. 시간 내 주셔서 대단히 감사합니다! – Antiartificial