举一个有联系人的假例子,每个联系人可以有一个或零个短信记录;我可以这样做

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

08-18 23:05