[英]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不支持完全外部聯接,因此這是一個使用聯合以及左右外部聯接的解決方案。
我有三個表, companies
, contacts
和companies_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.