假设存在联系人的假例子,并且对于每个联系人,可以有一个或零个Sms记录;我可以这样做
SELECT Contact.id, Contact.name, Sms.provider, Sms.number FROM Contact, Sms WHERE Sms.contactId = Contact.id.
但即使该联系人没有短信号码,我也需要显示一行。
我知道有两种方法可以实现这一目标。一个是两个选择的UNION
(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方法需要两次通过数据库,而子语句方法需要在同一个表上进行两次查找。
我经常遇到这种情况,我更喜欢在MySQL中拥有所有代码,而不是使用软件代码来实现这一目标。使用MySQL通常会变得更有效,也更简单。我使用的许多实际情况都涉及大型数据库。
有没有办法通过一个查询从相关表中获取两个字段?
答案 0 :(得分:2)
但即使我需要显示一行 没有短信号码 接触。
然后使用LEFT OUTER JOIN
,即使右表中没有对应的行,也会从左表中返回一行。
当你只用逗号列出表时,学习总是使用JOIN语法而不是伪内连接是个好主意。
SELECT
Contact.id,
Contact.name,
Sms.provider,
Sms.number
FROM
Contact
LEFT OUTER JOIN
Sms
ON
Sms.contactId = Contact.id