具有多个列的MySQL子语句

时间:2011-02-05 20:18:56

标签: mysql select

假设存在联系人的假例子,并且对于每个联系人,可以有一个或零个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通常会变得更有效,也更简单。我使用的许多实际情况都涉及大型数据库。

有没有办法通过一个查询从相关表中获取两个字段?

1 个答案:

答案 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