4

私はmysqlデータベースを使用しています。バグとプロファイルの 2 つのテーブルがあります。Bugs テーブルには、多対 1 の関係によってプロファイルを指す 2 つの列 (assigned_to、qa_contact) があります。これらは私のクエリの簡略化されたバージョンです。

まず、私はこれをやろうとしていましたが、バグテーブルで qa_contact が 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 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

しかし、2 番目のアプローチでは、qa_contact が null である結果を除外します。私は何百万ものレコードを扱っており、結果セットにさらにフィルターを追加したいので、これを行う効率的な方法を提案できますか?

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 がテーブルに存在しない場合でも、AはテーブルLEFT JOINからデータを返します。bugsprofiles

于 2012-11-09T19:09:49.513 に答える