2011-02-05 102 views
1

假设存在联系人并且每个联系人都有一个或零个Sms记录的假示例;我可以做到这一点具有多个列的MySQL子状态

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). 

和另一个的UNION是二substatements

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通常变得更加高效和简单。我所处理的许多实际情况都涉及大型数据库。

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

回答

2

但我需要表现出一行即使 没有为该 接触没有SMS号码。

然后使用LEFT OUTER JOIN,即使在右表中没有对应的行,也会从左表中返回一行。

当你用逗号列出表格时,学习总是使用JOIN语法而不是伪内连接是个好主意。

SELECT 
    Contact.id, 
    Contact.name, 
    Sms.provider, 
    Sms.number 
FROM 
    Contact 
LEFT OUTER JOIN 
    Sms 
ON 
    Sms.contactId = Contact.id 
+0

工程就像一个魅力!谢谢。值得注意的是,这将显示没有短信的联系人,但不会显示没有联系人的短信,因为联系人是左侧和起点。 – 2011-02-10 00:31:04