2011-03-21 107 views
1

問候!我在創建引用多個表的查詢時遇到困難。我是SQL新手,聯接困擾着我。我瞎了Google的搜索範圍後,發現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(由變量State過濾)。理想的情況下返回是這樣的:

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' 

我知道這可能不是去了解這一點的最好方式,但我認爲最好單獨存放東西VS每個項目的冗餘信息。 disp_profile中的數據集大約有1000條記錄,zip_codes大約爲30,000條。使用子查詢可以更輕鬆地完成這項工作嗎?謝謝你的時間!

+0

你的輸出似乎很好!我不確定什麼是錯誤,你想要什麼結果? – rkg 2011-03-21 07:59:01

回答

1

不,你做得很好。這就是加入的地方,這裏不需要使用子查詢。你可以,但它不會更好地執行(MySQL查詢優化器甚至可能會將它轉換爲內部連接)。

如果您擔心速度:把字「解釋」在你的SELECT語句的前面,看看MySQL是這樣做的:

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 2011-03-21 21:25:03

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 2011-03-21 08:10:25

+0

我只是發現舊的語法更容易理解,但這可能是因爲我實際上必須使用所有那些正確的,外部的,顛倒的,略微傾斜的連接的次數,我可以指望一隻腳的手指:-) – paxdiablo 2011-03-21 08:13:11

+0

Paxdiablo,感謝您的解決方案。它有效,但是錯誤完全在於我的結局。我擁有的郵政編碼數據不完整,並解釋了這種時髦的行爲。非常感謝您的寶貴時間! – Antiartificial 2011-03-21 21:25:34