mysql - 在这种情况下如何编写连接查询 : 1 if not exist, 不是限制 2 如果存在,则必须在这些时间

标签 mysql join left-join

一开始我需要处理一个简单的情况作为入口控制:

表A:

编号 |姓名 |日期

11 |姓名 | 2017-01-01

12 |姓名 | 2017-01-01

13 |姓名 | 2017-01-01

23 |姓名 | 2017-01-01

表 B:

编号 |开始日期 |结束日期

11 | 2017-01-01 | 2017-01-31

12 | 2017-02-01 | 2017-02-15

13 | 2017-01-01 | 2017-01-31

==========================================

我应该找到可以在 begin_date 和 end_date 之间的人:

我的初始查询是:

select a.id from tmp.a join tmp.b on a.id=b.id and (a.date between b.begin_date and b.end_date);

它应该返回 id 11 和 13,这是正确的。

但是后来我的老板告诉我,id 23 也应该进入,因为它不在表 B 中,所以 begin_date 和 end_date 没有限制。

有什么方法可以修改我的查询,使查询也可以返回 id 23?

一个普遍的问题是如何在以下情况下“加入”:当记录存在时,执行具有特定条件的内连接,当它不存在时,执行左连接。

谢谢。

最佳答案

请进行以下更改:

select id from A left join B on ((A.id=B.id and (A.entry_date between B.begin_date and end_date)) or B.begin_date IS NULL)

  1. 使用左连接
  2. 还有一个或条件,即 B.begin_date IS NULL

关于mysql - 在这种情况下如何编写连接查询 : 1 if not exist, 不是限制 2 如果存在,则必须在这些时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43579221/

相关文章:

mysql - 如何在mysql中设置计数器?

mysql。使用 IF 选择 field=1 或 field=2

mysql - 即使条件不成立,也会在连接中返回结果

sql - JOIN 打破 WHERE 子查询

sql-server - 参数化存储过程条件连接,通过 3 个参数在连接表中搜索

mysql - 重写mysql语句-select left join alias union join减法问题

java - 在 HQL 上加入声明

MySQL Where IN 数组

java - 使用联接定义 JPA 存储库 native 查询

php - 当 WHERE 子句中缺少一个字段时,防止整个 JOINed MYSQL 查询失败