2009-10-10 42 views
0

我想從MySQL DB中選擇一些AddressesAddresses可以具有ContactOrganization或兩者。 (A Contact可以有很多Addresses,因此可以在Organization。)MySQL排序SELECT by關聯列

比方說,我想所有的OrganizationAddresses的。這沒什麼大不了的。但是如果我想ORDER他們通過Contact.last_name?一些Addresses沒有Contact

我做了一些試驗,發現如果你ORDER BY contacts.last_name,那麼只有那些AddressesContact將被返回。我試過ORDER BY contacts.last_name, addresses.street1,但仍然只有Addresses有一個關聯的Contact被返回。

是否有會找到Organization.idAddresses,由Contact.last_name訂購的結果,包括所有的OrganizationAddresses,沒有一個Contact甚至是那些查詢?


表結構

addresses 
--------- 
id 
contact_id 
organization_id 
street1 

contacts 
-------- 
id 
last_name 

organizations 
------------- 
id 
name 

解決方案:

返回所有OrganizationAddresses

SELECT a.* 
FROM addresses a 
LEFT JOIN contacts c 
ON a.contact_id = c.id 
WHERE a.organization_id = '8283' 
ORDER BY c.last_name 

好的,很好,上面的查詢解決了它。

+0

有關表結構或您嘗試過的查詢的更多信息將會有所幫助。 – 2009-10-10 20:08:34

+0

'ORDER BY'不會過濾結果。默認排序是升序(ASC),因此空值位於列表頂部。我認爲你將ORDER BY與JOIN標準混合 - 發佈你正在使用的查詢。 – 2009-10-10 20:12:11

+0

如果你可以避免,我會敦促你不要添加虛擬數據。 – akf 2009-10-10 20:13:27

回答

3

問題可能是連接而不是order by子句。只要您將Addresses表與聯繫人表加入,聯接條件將消除具有空值的所有元組。

要避免這種情況,您必須使用OUTER JOIN而不是INNER JOIN(默認值)。 OUTER JOIN背後的想法僅僅是爲了處理/排序等,用NULL值來擴展缺失的錶行。

+0

是的,這是問題所在。我不明白ORDER BY。謝謝您的幫助。 – Ethan 2009-10-10 20:45:46

+0

+++ 1 :-) aus .at – Flavius 2010-02-11 20:35:36

2

當沒有關聯的聯繫人時,可以使用MySQL IFNULL函數返回空字符串。這樣,如果地址沒有關聯的聯繫人,如果沒有聯繫人,您仍然會在聯繫人列中獲得空字符串的記錄。

例如:

SELECT a.*, 
IFNULL(c.last_name, '') AS last_name 
FROM Addresses a 
LEFT JOIN Contacts c 
ON a.contact_id = c.id 
ORDER BY IFNULL(c.last_name, '') 

正如其他人所指出的那樣,ORDER BY不篩選出缺失的記錄。確保您的查詢具有正確的連接,即使沒有關聯的聯繫人,它也會返回記錄。我已經添加了IFNULL來返回一個空字符串而不是NULL,但這只是爲了美觀,並不實際更改返回的記錄數。

+0

感謝您的代碼示例。這是一個很大的幫助。 – Ethan 2009-10-10 20:46:20