首页 > 解决方案 > MySQl 查询中的基本布尔逻辑

问题描述

有关详细信息,请参阅此小提琴

基本上,我正在为 3 家公司之一的工作搜索一个非常基本的测试数据库:BAe、Thales 和 Google。

当以表格形式显示时,数据库看起来像这样(结构的完整细节在小提琴中):

Candidate name  Company Job year    Skills
One             Thales  2015        C
One             BAe     2016        Python
One             Google  2017        C++
Two             BAe     2015        C++
Two             Google  2020        Python
Two             Thales  2019        C++, UML
Three           Google  2019        Python

我正在尝试各种查询以查找谁在哪些公司工作过(技能与这个问题无关)。

这个查询:

SELECT DISTINCT candidate_id FROM jobs j
WHERE 1=1
AND ( EXISTS (
             SELECT * FROM companies c
             WHERE c.company_id = j.company_id
             AND UPPER(c.company_name) LIKE 'THALES'));

正确给出:

+--------------+
| candidate_id |
+--------------+
|            1 |
|            3 |
+--------------+
2 rows in set (0.00 sec)

这个查询:

SELECT DISTINCT candidate_id FROM jobs j 
WHERE 1=1 
AND ( EXISTS (
             SELECT * FROM companies c 
             WHERE c.company_id = j.company_id 
             AND UPPER(c.company_name) LIKE 'GOOGLE'));

正确给出

+--------------+
| candidate_id |
+--------------+
|            1 |
|            2 |
+--------------+
2 rows in set (0.00 sec)

但是,当我尝试结合,找到一个在泰雷兹和谷歌工作过的候选人时,我希望得到候选人 1,但结果却是空的:

SELECT DISTINCT candidate_id FROM jobs j 
WHERE 1=1 
AND ( EXISTS ( 
             SELECT * FROM companies c 
             WHERE c.company_id = j.company_id 
             AND UPPER(c.company_name) LIKE 'THALES') 
 AND  EXISTS ( 
             SELECT * FROM companies c 
             WHERE c.company_id = j.company_id 
             AND UPPER(c.company_name) LIKE 'GOOGLE') 
);

Empty set (0.00 sec)

最后一个查询有什么问题?

标签: mysqlsqljoinsubqueryhaving-clause

解决方案


您正在搜索jobs表格,因此您正在寻找泰雷兹和谷歌的工作,然后为这些工作选择所有不同的候选人。

由于工作(在您的数据模型中)仅在一家公司,因此没有工作可以匹配,因此不会返回任何候选人。

下面的查询将给出你想要的:

select * from candidates c
where 1=1
and ( exists (
  select * from jobs j
  where j.candidate_id = c.candidate_id
  and (exists (select * from companies com where com.company_id = j.company_id and upper(com.company_name) like 'THALES'))
))
and ( exists (
  select * from jobs j
  where j.candidate_id = c.candidate_id
  and (exists (select * from companies com where com.company_id = j.company_id and upper(com.company_name) like 'GOOGLE'))
));

推荐阅读