MySQL按关联列排序SELECT

时间:2009-10-10 19:59:50

标签: sql mysql

我想从MySQL DB中选择一些AddressesAddresses可以有ContactOrganization或两者。 (Contact可以有多个AddressesOrganization也可以。{/ p>

假设我想得到Organization Addresses的全部内容。这没什么大不了的。但是,如果我想ORDER Contact.last_name,我该怎么办?有些Addresses没有Contact

我做了一些实验,发现如果你ORDER BY contacts.last_name,那么只有那些Addresses的{​​{1}}会被退回。我尝试了Contact,但仍然只返回了ORDER BY contacts.last_name, addresses.street1已关联的Addresses

是否有Contact Addresses查询Organization.id,按Contact.last_name排序,并包含所有Organization的{​​{1}},甚至哪些没有Addresses


表格结构

Contact

解决方案:

返回全部 addresses --------- id contact_id organization_id street1 contacts -------- id last_name organizations ------------- id name 的{​​{1}}:

Organization

好的,上面的查询很好解决了它。

2 个答案:

答案 0 :(得分:3)

问题可能是连接而不是order-by子句。只要将Addresses表与Contacts表一起加入,连接条件就会消除所有具有NULL值的元组。

要避免这种情况,您必须使用OUTER JOIN而不是INNER JOIN(默认值)。 OUTER JOIN背后的想法只是使用NULL值扩展缺失的表行以进行处理/排序等等。

答案 1 :(得分: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,但这只是为了美观而实际上并没有改变返回的记录数。