簡體   English   中英

mysql-當任何一個表可能缺少連接記錄時如何搜索2個表

[英]mysql - how do I search 2 tables when either one may be missing the join record

我有一個公司的2個表和一個聯系表。 聯系人表包含company_id,這是公共字段

我正在寫一個搜索,我想從兩個表中返回公司名稱和聯系人姓名的信息。 我遇到的問題是,可能有一家公司沒有聯系,或者有一家公司沒有聯系。 兩者都是合法的

如果我寫

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。 現在,我必須從聯系人到關聯表再到公司,完全外部連接沒有任何區別。

您正在尋找完整的外部聯接。 這樣,您將從兩個表中獲取所有記錄,並在可能的情況下將其合並。 不幸的是,MySQL不支持完全外部聯接,因此這是一個使用聯合以及左右外部聯接的解決方案。

我有三個表, companiescontactscompanies_contacts ,其中最后一個是關聯表。 這是這三個的各自內容:

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%';

在這兩個查詢之間使用並集將合並其結果,並消除兩者之間的任何重復項:

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%';

根據前面提到的數據,將得出以下結果:

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

這正是您要尋找的結果。

我會建議:

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

因此,您不會得到完整的空結果。

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%'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM