2011-03-10 13 views
0

私は2つのテーブルに会社と連絡先テーブルを持っています。連絡先表には共通項目であるcompany_idが含まれていますmysql - どちらか一方に結合レコードがない場合、2つのテーブルを検索するには

私は検索を書いていますが、私は両方の表、会社名、連絡先から情報を返したいと思います。私が抱えている問題は、会社のない連絡先や連絡先のない会社があるかもしれないということです。私は

SELECT c.name, k.name from contact c 
LEFT OUTER JOIN company k ON k.company_id = c.company id 
WHERE c.name like '%search_word%' || k.name like '%search_word%' 

を書く場合はどちらも私が持っているかの企業を持っていない連絡先を取得

法的ですが、私は何の接点を持っていない企業を得ることはありません。

実際、私の問題は悪化しています。会社は多くの連絡先を持つことができるので、company_idとcontact_idを含む関連付けテーブルがあります。 今私は連絡先から会社への連絡先テーブルに移動しなければならず、完全外部結合は何の違いもありません。

答えて

3

あなたは完全な外部結合を探しています。そうすれば、可能であれば両方のテーブルからすべてのレコードを取得します。残念ながら、MySQLは完全な外部結合をサポートしていないため、ここでは結合と左外部結合を使用するソリューションがあります。

私は3つのテーブル、companiescontacts、およびcompanies_contactsを持っています。この最後のテーブルは関連テーブルです。ここでは3のそれぞれの内容は次のとおりです。

mysql> select * from companies; 

+------------+---------+ 
| company_id | company | 
+------------+---------+ 
|   1 | Foo  | 
|   2 | Bar  | 
|   3 | Baz  | 
+------------+---------+ 
3 rows in set (0.00 sec) 

mysql> select * from contacts; 
+------------+---------+ 
| contact_id | contact | 
+------------+---------+ 
|   1 | Fred | 
|   2 | Barney | 
|   3 | Wilma | 
|   4 | Betty | 
+------------+---------+ 
4 rows in set (0.00 sec) 

mysql> select * from companies_contacts; 
+------------+------------+ 
| company_id | contact_id | 
+------------+------------+ 
|   1 |   1 | 
|   1 |   2 | 
|   2 |   2 | 
|   2 |   4 | 
+------------+------------+ 
4 rows in set (0.00 sec) 

あなたは少しそれを再考すると、問題が簡単になる:可能であれば自分に関連した企業と一緒に、あなたは基準を満たすすべての連絡先をしたい、とあなたはすべてしたいです可能であれば、関連する連絡先とともに、基準を満たす企業。

select company, contact 
from  companies 
left join companies_contacts using (company_id) 
left join contacts   using (contact_id) 
where  company like '%B%'; 

そして:

select  company, contact 
from  companies 
right join companies_contacts using (company_id) 
right join contacts   using (contact_id) 
where  contact like '%W%'; 

を自分の結果を結合し、両者の間の任意の重複を排除するこれらの2つのクエリの間で労働組合を使用:

select  company, contact 
from  companies 
left join companies_contacts using (company_id) 
left join contacts   using (contact_id) 
where  company like '%B%' 
union 
select  company, contact 
from  companies 
right join companies_contacts using (company_id) 
right join contacts   using (contact_id) 
where  contact like '%W%'; 
を我々は2つの外部結合を使用して、これらの2つの問題を解決することができます

上記のデータでは、結果は次のようになります。

+---------+---------+ 
| company | contact | 
+---------+---------+ 
| Bar  | Barney | 
| Bar  | Betty | 
| Baz  | NULL | 
| NULL | Wilma | 
+---------+---------+ 

これはまさにあなたが探している結果です。

+0

ありがとう、構文は何ですか? – sdfor

+2

「LEFT OUTER JOIN」というより「FULL OUTER JOIN」と言っています。 –

+0

ありがとう、私は実際に関連テーブルを通過しているので、両方の結合を完全にして問題を変更しないため、私の質問を編集しました – sdfor

1

私がお勧めします:

SELECT c.name, k.name from contact c 
FULL OUTER JOIN company k ON (k.company_id = c.company id) 
WHERE c.name LIKE '%search_word%' || k.name LIKE '%search_word%' 
AND NOT(c.name is null AND k.name is null); 

ですから、完全なヌル結果を得ることはありません。

+0

ありがとう、連絡先と会社の間に関連テーブルがあることを発見したので、私は質問を書き直す必要があります。 – sdfor

1
select c.name, k.name 
from association a 
right outer join company k on k.company_id = a.company_id 
right outer join contact c on c.company_id = a.company_id 
where c.name like '%search_word%' || k.name like '%search_word%' 
+0

ありがとう、これは意味があります、私はそれを試みるつもりです – sdfor

+0

関連付けレコードがない場合会社または連絡先のいずれかを戻してください。 – sdfor

+0

@sdfor左から右に変更されました。 –

関連する問題