mysql - 连接 2 个 MySQL 表的多个值

标签 mysql join subquery

我正在使用this example database我从两个不同的表运行以下查询

mysql> select * from salaries where emp_no=10017;
+--------+--------+------------+------------+
| emp_no | salary | from_date  | to_date    |
+--------+--------+------------+------------+
|  10017 |  71380 | 1993-08-03 | 1994-08-03 |
|  10017 |  75538 | 1994-08-03 | 1995-08-03 |
|  10017 |  79510 | 1995-08-03 | 1996-08-02 |
|  10017 |  82163 | 1996-08-02 | 1997-08-02 |
|  10017 |  86157 | 1997-08-02 | 1998-08-02 |
|  10017 |  89619 | 1998-08-02 | 1999-08-02 |
|  10017 |  91985 | 1999-08-02 | 2000-08-01 |
|  10017 |  96122 | 2000-08-01 | 2001-08-01 |
|  10017 |  98522 | 2001-08-01 | 2002-08-01 |
|  10017 |  99651 | 2002-08-01 | 9999-01-01 |
+--------+--------+------------+------------+
10 rows in set (0.01 sec)

mysql> select * from titles where emp_no=10017;
+--------+--------------+------------+------------+
| emp_no | title        | from_date  | to_date    |
+--------+--------------+------------+------------+
|  10017 | Senior Staff | 2000-08-03 | 9999-01-01 |
|  10017 | Staff        | 1993-08-03 | 2000-08-03 |
+--------+--------------+------------+------------+
2 rows in set (0.01 sec)

现在我想要的是连接这两个表,以便得到下表

emp_no  title           salary  years
10017   Staff           71380   1993
10017   Staff           75538   1994
10017   Staff           79510   1995
10017   Staff           82163   1996
10017   Staff           86157   1997
10017   Staff           89619   1998
10017   Staff           91985   1999
10017   Staff           96122   2000
10017   Staff           98522   2001
10017   Senior Staff    99651   2002

但是我尝试连接这两个表,我得到如下重复值,这是合乎逻辑的,因为表 2 中的 2 个值与表 1 中的 10 个值相关。我还尝试使用 from_date 连接多个列,但您可以看到日期略有不同,所以我不能这样做。

mysql> select salaries.emp_no, titles.title, salaries.salary, salaries.from_date
from titles
inner join salaries
on salaries.emp_no = titles.emp_no
where salaries.emp_no=10017; 

emp_no  title           salary  from_date
10017   Senior Staff    71380   1993-08-03
10017   Senior Staff    75538   1994-08-03
10017   Senior Staff    79510   1995-08-03
10017   Senior Staff    82163   1996-08-02
10017   Senior Staff    86157   1997-08-02
10017   Senior Staff    89619   1998-08-02
10017   Senior Staff    91985   1999-08-02
10017   Senior Staff    96122   2000-08-01
10017   Senior Staff    98522   2001-08-01
10017   Senior Staff    99651   2002-08-01
10017   Staff           71380   1993-08-03
10017   Staff           75538   1994-08-03
10017   Staff           79510   1995-08-03
10017   Staff           82163   1996-08-02
10017   Staff           86157   1997-08-02
10017   Staff           89619   1998-08-02
10017   Staff           91985   1999-08-02
10017   Staff           96122   2000-08-01
10017   Staff           98522   2001-08-01
10017   Staff           99651   2002-08-01

我的问题:在没有其他方法链接它们的情况下,我怎样才能获得所需的结果?或者有什么我忘记了?

最佳答案

检查日期是否重叠:

Determine Whether Two Date Ranges Overlap

select salaries.emp_no, titles.title, salaries.salary, salaries.from_date
from titles
inner join salaries
   on salaries.emp_no = titles.emp_no
  AND salaries.from_date <= titles.to_date 
  AND salaries.to_date >= titles.from_date
where salaries.emp_no=10017; 

编辑:可能只需包含检查即可完成工作

  AND salaries.from_date >= titles.from_date
  AND salaries.to_date < titles.to_date 

关于mysql - 连接 2 个 MySQL 表的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47018617/

相关文章:

php - 就像解析器一样,我可以将用户输入作为方程式并使用 PHP 和 MYSQL 在此基础上执行计算吗?

MySQL 连接两行

php - MySQL:使用 AS 变量进行查询不起作用

mysql - 仅在 JOIN 不起作用时显示记录的子查询

sql - 带有 select 子查询的 Sybase insert 语句

MYSQL游标实现问题

mysql - SQL group by week的一些问题

mysql - 如何将 MySQL 数据库转换为 XML?

mysql - Laravel join 用于获取一对多关系?

mysql - SQL 加入预先加入的地方