2010-04-11 99 views
3

我有3個表是這樣的(這裏簡化OFC):MySQL的一個一對多查詢

  • 用戶
    • USER_ID
    • USER_NAME
  • info
    • info_id
    • USER_ID
  • 接觸
    • CONTACT_ID
    • USER_ID
    • contact_data

用戶與信息的一比一的關係,雖然info do總是沒有相關的條目。

用戶與聯繫人有一對多的關係,儘管聯繫人並不總是有相關的條目。

我知道我可以用左連接抓住正確的'用戶'+'信息',有沒有辦法一次獲得我想要的所有數據?

例如,一個返回的記錄可能是:

user_id: 5 
user_name: tom 
info_id: 1 
rate: 25.00 
contact_id: 7 
contact_data: 555-1212 
contact_id: 8 
contact_data: 555-1315 
contact_id: 9 
contact_data: 555-5511 

這可能與一個單一的查詢?或者我必須使用多個?

回答

2

結果的每一行都必須具有相同的列,因此您不能聚合多行不具有其他列的聯繫人。

希望,這個查詢將實現你所需要的:

SELECT 
    u.user_id as user_id, 
    u.user_name as user_name, 
    i.info_id as info_id, 
    i.rate as rate, 
    c.contact_id as contact_id, 
    c.contact_data as contact_data 
FROM users as u 
LEFT JOIN info as i ON i.user_id = u.user_id 
LEFT JOIN contacts as c ON c.user_id = u.user_id 
+1

我剛剛在我的DB上構建了一個實際的查詢,它產生了大量的冗餘數據,這給我提供了我需要的所有數據,但看起來像是過度殺傷。我想我會去用兩種查詢方法,但很高興知道如何正確構建帶有多個連接的查詢。 – Stomped 2010-04-11 16:01:51

5

這是可以做到你的要求在一個查詢什麼,但你要麼需要一個變量數列這是邪惡的,因爲SQL不是爲此設計的,或者你必須有固定數量的列,這更糟糕,因爲沒有明確的固定列數可供選擇。

我建議使用兩種方式之一:

1.返回一行爲每個聯繫人數據,重複在其他列中的數據:

 
5 tom 1 25.00 7 555-1212 
5 tom 1 25.00 8 555-1315 
5 tom 1 25.00 9 555-5511 

的問題,這當然是冗餘數據通常是一個壞主意,但如果沒有太多的冗餘數據,那就沒問題了。在這裏使用你的判斷。

2.使用兩個查詢。這意味着週轉時間稍長,但傳輸的數據較少。

在大多數情況下,我更喜歡第二種解決方案。

您應該儘量避免在循環中進行大量查詢。這幾乎總是可以重寫爲單個查詢。但是,如果使用兩個查詢是解決您的問題的最自然的方法,那麼只需使用兩個查詢即可。爲了減少查詢次數,不要試圖將所需的所有數據都塞進單個查詢中。