MySQl查询中的基本布尔逻辑
有关详细信息,请参阅 基本上,我正在搜索一个非常基本的测试数据库,以查找三家公司之一的工作:BAe、Thales和Google 当以表格形式显示时,数据库看起来是这样的。结构的全部细节在小提琴上: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
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 |