4

我正在使用mysql数据库。我有两个表错误和配置文件。Bugs 表有两列(assigned_to、qa_contact),通过多对一关系指向配置文件。这些是我的查询的简化版本。

首先,我试图这样做,但它返回错误表中 qa_contact 为空的重复行

select 
  bug_id, 
  desc, 
  dev.assigned_to, 
  qa.qa_contact 
from 
 bugs, 
 profiles as dev, 
 profiles as qa
where 
  assigned_to = dev.userid 
  and (qa_contact = qa.userid or qa_contact is null)

其次,我的新方法是:

select bug_id, desc, dev.assigned_to, qa.qa_contact 
from 
 bugs, 
 profiles as dev, 
 profiles as qa
where 
  assigned_to = dev.userid 
  and qa_contact = qa.userid

 UNION

select bug_id, desc, dev.assigned_to, null 
from 
 bugs, 
 profiles as dev, 
 profiles as qa
where 
  assigned_to = dev.userid 
  and qa_contact is null

但在第二种方法中,它排除了 qa_contact 为空的结果。任何人都可以提出一种有效的方法来执行此操作,因为我正在处理数百万的记录,并且希望在结果集上添加更多过滤器。

4

2 回答 2

7

这就是 LEFT JOIN 的用途:

SELECT bug_id, `desc`, dev.assigned_to, qa.qa_contact 
FROM bugs
INNER JOIN profiles as dev ON bugs.assigned_to = dev.userid
LEFT OUTER JOIN profiles as qa ON bugs.qa_contact = qa.userid
于 2012-11-09T19:09:30.463 回答
2

我想你想使用一个LEFT JOIN

select bug_id, desc, dev.assigned_to, qa.qa_contact 
from bugs b
left join profiles dev
  b.assigned_to dev.userid
left join profiles qa
  on b.qa_contact = qa.userid

如果您在学习JOIN语法方面需要帮助,那么这里有一个很好的连接可视化解释

即使 id 在表中不存在,ALEFT JOIN也会从表中返回数据。bugsprofiles

于 2012-11-09T19:09:49.513 回答