2011-09-22 108 views
0

我有這種一對多的關係。另外,並不是所有的「主要」記錄都會在第二個數據庫表中有聯合記錄。MySQL - 複雜的LEFT JOIN

這裏是我的表:

tbl_customers tbl_addresses

tbl_customers一位顧客記錄可以明顯地有多個地址,在tbl_addresses表。

這是我的困境。有很多客戶記錄有多個地址,我將其中一個地址記錄分配爲客戶記錄的「主要」地址。這只是一個簡單的column,稱爲:primaryAddress。如果該地址記錄是主地址,則該值將是數字1。

因此,這裏是我的查詢:

SELECT c.customername, a.state 
FROM `tbl_customers` c 
LEFT JOIN `tbl_addresses` a ON c.customerid = a.customerid 

該查詢將導致超過1個地址任何客戶重複記錄。 如果我補充一點的LEFT JOIN:

SELECT c.customername, a.state 
FROM `tbl_customers` c 
LEFT JOIN `tbl_addresses` a ON c.customerid = a.customerid AND a.primaryAddress = 1 

這不會產生任何結果,甚至當我在數據庫中看到有大量的地址記錄與primaryAddress = 1

所以我以爲我的查​​詢是錯誤的。

有人能看到我失蹤的東西嗎?

+0

我要補充一點,有很多客戶記錄沒有地址記錄呢。我仍然需要顯示這些客戶,但將a.state保留爲空。(這就是我選擇LEFT JOIN的原因)。 – coffeemonitor

+1

我發現你寫的第二個查詢沒有錯。還有什麼你遺漏了嗎? –

回答

0

爲了任何人誰碰巧登陸本頁面尋找一個解決方案上:

這個方法不能回答這個問題

用戶能夠討論後自己身上找原因問題在這裏。原來他的原始代碼有一個錯字。 發佈在問題上的第二個SQL代碼塊是正確的,並且應該給出預期結果。用戶JoeStefanelli指出了這一點+1。

請閱讀評論瞭解詳情。我的原始答案如下。現在我看到我應該刪除它,而不是試圖修改它,我很快意識到它是有缺陷的。至少討論幫助用戶找到解決的辦法......


我原來的答覆:

你幾乎沒有。相反,將a.primaryAddress = 1添加到WHERE子句。

編輯

不知道這是否會排除的costumers從結果零個地址...

+0

否。將該條件添加到WHERE子句將強制JOIN的行爲與INNER JOIN類似。它在哪裏是正確的。 –

+0

你說得對。它排除了沒有地址的客戶。補充它 – coffeemonitor

+0

是的,這就是我在回答後意識到的。但我不明白爲什麼你的問題的第二個查詢沒有產生任何結果!我正在測試一個類似的結構,它適用於我。 – bfavaretto