我想从MySQL DB中选择一些Addresses
。 Addresses
可以有Contact
,Organization
或两者。 (Contact
可以有多个Addresses
。Organization
也可以。{/ 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
好的,上面的查询很好解决了它。
答案 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,但这只是为了美观而实际上并没有改变返回的记录数。