2011-02-05 32 views
1

假設存在聯繫人並且每個聯繫人都有一個或零個Sms記錄的假示例;我可以做到這一點具有多個列的MySQL子狀態

SELECT Contact.id, Contact.name, Sms.provider, Sms.number FROM Contact, Sms WHERE Sms.contactId = Contact.id. 

但我需要顯示一個行,即使沒有該聯繫人的短信號碼。

我知道有兩種方法可以實現這一點。一個是具有兩個選擇

(SELECT Contact.id, Contact.name, Sms.provider, Sms.number FROM Contact, Sms WHERE Sms.contactId = Contact.id) UNION (SELECT id, name, null provider, null number FROM Contact WHERE (SELECT 1 FROM Sms WHERE contactId = Contact.id) IS NULL). 

和另一個的UNION是二substatements

SELECT id, name, (SELECT provider FROM Sms WHERE contactId = Contact.id) provider, (SELECT number FROM Sms WHERE contactId = Contact.id) number FROM Contact 

的UNION方法需要通過數據庫去兩次,substatements方法需要在同一個表中的兩個查找。

我經常遇到這種情況,我更喜歡MySQL中的所有代碼,而不是使用軟件代碼來完成此操作。使用MySQL通常變得更加高效和簡單。我所處理的許多實際情況都涉及大型數據庫。

有沒有辦法從一個查詢中獲取相關表中的兩個字段?

回答

2

但我需要表現出一行即使 沒有爲該 接觸沒有SMS號碼。

然後使用LEFT OUTER JOIN,即使在右表中沒有對應的行,也會從左表中返回一行。

當你用逗號列出表格時,學習總是使用JOIN語法而不是僞內連接是個好主意。

SELECT 
    Contact.id, 
    Contact.name, 
    Sms.provider, 
    Sms.number 
FROM 
    Contact 
LEFT OUTER JOIN 
    Sms 
ON 
    Sms.contactId = Contact.id 
+0

工程就像一個魅力!謝謝。值得注意的是,這將顯示沒有短信的聯繫人,但不會顯示沒有聯繫人的短信,因爲聯繫人是左側和起點。 – 2011-02-10 00:31:04

相關問題