举一个有联系人的假例子,每个联系人可以有一个或零个短信记录;我可以这样做
SELECT Contact.id, Contact.name, Sms.provider, Sms.number FROM Contact, Sms WHERE Sms.contactId = Contact.id.
但我需要显示一行,即使没有该联系人的短信号码。
我知道有两种方法可以做到这一点。一个是两个选择的联合
(SELECT Contact.id, Contact.name, Sms.provider, Sms.number FROM Contact, Sms WHERE Sms.contactId = Contact.id) UNION (SELECT id, name, null provider, null number FROM Contact WHERE (SELECT 1 FROM Sms WHERE contactId = Contact.id) IS NULL).
另一个是两个子语句
SELECT id, name, (SELECT provider FROM Sms WHERE contactId = Contact.id) provider, (SELECT number FROM Sms WHERE contactId = Contact.id) number FROM Contact
UNION方法需要遍历数据库两次,substatements方法需要在同一个表上查找两次。
我经常遇到这种情况,我更喜欢用MySQL编写所有的代码,而不是用软件代码来完成这项工作。使用MySQL通常会变得更加高效和简单。我处理的许多实际情况都涉及大型数据库。
有没有办法用一个查询从相关表中获取两个字段?
最佳答案
但我需要表现出一个排,即使
没有短信号码
联系。
然后使用LEFT OUTER JOIN
,它从左表返回一行,即使右表中没有对应的行。
当您只列出带逗号的表时,最好学会始终使用联接语法,而不是伪内部联接。
SELECT
Contact.id,
Contact.name,
Sms.provider,
Sms.number
FROM
Contact
LEFT OUTER JOIN
Sms
ON
Sms.contactId = Contact.id