MySQl查询中的基本布尔逻辑

MySQl查询中的基本布尔逻辑,mysql,sql,join,subquery,having-clause,Mysql,Sql,Join,Subquery,Having Clause,有关详细信息,请参阅 基本上,我正在搜索一个非常基本的测试数据库,以查找三家公司之一的工作:BAe、Thales和Google 当以表格形式显示时,数据库看起来是这样的。结构的全部细节在小提琴上: Candidate name Company Job year Skills One Thales 2015 C One BAe 2016 Python One Google 201

有关详细信息,请参阅

基本上,我正在搜索一个非常基本的测试数据库,以查找三家公司之一的工作: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'));
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 |
|            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 'THALES'));
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)
上一个查询有什么问题?

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

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

下面的查询将提供您想要的内容:

从候选项c中选择* 其中1=1 存在 从jobs j中选择* 其中j.candidate\u id=c.candidate\u id 并且存在从companys com中选择*,其中com.company\u id=j.company\u id和uppercom.company\u名称,如“THALES” 存在 从jobs j中选择* 其中j.candidate\u id=c.candidate\u id 并且存在从companys com中选择*,其中com.company\u id=j.company\u id和uppercom.company\u名称类似“GOOGLE” ;
我认为这是一个聚合查询,在HAVING子句中进行过滤

在中,这将产生:

| candidate_id | | -----------: | | 1 |