2009-10-10 40 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