2014-02-24 113 views
0

我有一個數據庫有兩個表:users,users_addressescountriesMySQL返回記錄左連接表沒有記錄

當我選擇的用戶記錄,並將其綁定到模型中,我使用下面的語句:

SELECT 
`u`.`id`, `u`.`first_name`, `u`.`last_name`, 

`a`.`address_1`, `a`.`address_2`, 
`a`.`town`, `a`.`region`, `a`.`post_code`, `a`.`country`, 

`c`.`name` AS `country_name`, 
`c`.`eu` AS `eu_member` 

FROM `users` `u` 

LEFT JOIN `users_addresses` `a` 
    ON `a`.`user` = `u`.`id` 

LEFT JOIN `countries` `c` 
    ON `c`.`id` = `a`.`country` 

WHERE `a`.`default` = 1 
AND `u`.`id` = 3 

我遇到的問題是,如果表users_addresses不包含相應的記錄用戶然後我得到一個空的結果。如果有記錄 - 它應該只返回一個標記爲default = 1的記錄,但顯然最好確保它總​​是隻返回一個以防萬一,因爲任何原因,一個用戶將有多個地址標記爲默認值。

所以我的問題是 - 我怎麼能確保即使在users_addresses表中沒有相應的記錄,我仍然至少會得到用戶記錄以及如何確保查詢總是隻匹配一個地址記錄。

任何幫助將非常感激。

+0

移動狀態到'ON'條款:'ON a.user = u.id AND a.default = 1' –

回答

2

LEFT JOIN將包括來自左表項,如果有合適的表中沒有相應的條目。

然而在你的情況下,你過濾a.default = 1刪除沒有默認地址的條目。

爲了避免這種情況,你要麼需要使用子查詢

LEFT JOIN (
    SELECT * FROM user_adresses 
    WHERE `default` = 1 
) a 
ON a.user = u.id 

使用此選項可以通過在子選擇使用GROUP BY user限制爲最多一個「默認」每用戶地址加入。

或者你可以使用a.default = 1作爲連接條件,而不是一個WHERE條件,即

LEFT JOIN user_addresses a 
    ON a.user = u.id and a.default = 1 

沒有100%地肯定,去年的建議,但我非常有信心這會工作。

編輯:您顯然也有@steinmas建議的選項,即將默認的過濾器擴展爲接受null值。

爲了確保你得到用戶最多隻有一個默認的地址,你很可能會在某些時候需要GROUP BY user命令

+0

工程魅力!非常感謝 - 我用簡單的子查詢使用了第一個建議:LEFT JOIN(SELECT * FROM'{$ this - > _ table_2} WHERE'default' = 1 GROUP BY'date')'a' ON'a '.'user' ='u'.'id' –

1

試着改變你的WHERE子句這樣的:

WHERE (`a`.`default` = 1 OR `a`.`default` IS NULL) 
AND `u`.`id` = 3 
+0

Thanks @steinmas - that works。如果有兩個地址被標記爲默認,那麼有沒有建議確保它只對應一條記錄? (即ORDER BY LIMIT 0,1)? –

+0

您可以嘗試使用'u'表進行分組,以便每個用戶只顯示一行。 – steinmas

0

這是定義

的LEFT JOIN關鍵字返回所有行左表(表1), 與匹配的行中右表(表2)。當沒有匹配時,結果是NULL 在右側。

如果可以重新組織查詢

相關問題