查询表中的所有数据,仅连接联结表中的最新记录

Posted

技术标签:

【中文标题】查询表中的所有数据,仅连接联结表中的最新记录【英文标题】:Querying all data from a table joining ONLY the latest record from a junction table 【发布时间】:2014-11-17 18:09:30 【问题描述】:

我正在使用与此类似的数据库结构:http://dev.mysql.com/doc/employee/en/sakila-structure.html

表格:员工

包含每个员工信息的表格。

+---------+----------+
| emp_no* | emp_name |
+---------+----------+
| emp1    | John     |
| emp2    | Mike     |
| emp3    | Rob      |
| emp4    | Kim      |
+---------+----------+

表格:部门

包含公司部门信息的表格。

+----------+-----------+
| dept_no* | dept_name |
+----------+-----------+
|       1  | Dep 1     |
|       2  | Dep 2     |
|       3  | Dep 3     |
|       4  | Dep 4     |
|       5  | Dep 5     |
+----------+-----------+

联结表:emp_dept

主键:[ emp_no, from_date ]

用于跟踪员工以前工作或现在工作的部门的表格。

+---------+----------+------------+------------+
| emp_no* | dept_no  | from_date* |  to_date   |
+---------+----------+------------+------------+
| emp1    |        1 | 2010-01-01 | 2010-12-31 |
| emp2    |        2 | 2010-01-01 | 2013-10-31 |
| emp1    |        4 | 2010-12-31 | 2012-06-14 |
| emp3    |        3 | 2010-01-01 | 2011-08-14 |
| emp4    |        1 | 2010-01-01 | 2014-11-14 |
| emp2    |        5 | 2013-10-31 | 2014-11-14 |
| emp1    |        3 | 2012-06-14 | 2014-11-17 |
| emp3    |        1 | 2011-08-14 | 2013-07-20 |
| emp3    |        4 | 2013-07-20 | 2014-11-14 |
+---------+----------+------------+------------+

预期的表格:

¿我如何仅将联结表中每个员工的最新记录 (emp_dept) 加入到我的员工表中并获得如下表?

+---------+----------+--------+
| emp_no* | emp_name | dep_no |
+---------+----------+--------+
| emp1    | John     |      3 |
| emp2    | Mike     |      5 |
| emp3    | Rob      |      4 |
| emp4    | Kim      |      1 |
+---------+----------+--------+

【问题讨论】:

Employees 表中的emp_noemp_dept 表中的emp_no 不同。你应该如何链接这两个表 ups... 我刚刚更正了表格。感谢您的观察 【参考方案1】:

假设emp_dept.Emp_noemployees.Emp_no之间的关系

Select * from 
employees e
join emp_dept ed on e.emp_no = ed.emp_no 
                    and from_date = (Select Max(from_date) 
                       from emp_dept ed2 where ed2.emp_no = e.emp_no)

【讨论】:

【参考方案2】:

创建一个只为每个员工提供最后一个部门的查询,然后将其添加到您的主查询中的 JOIN 或 CROSS APPLY

... tables with joins etc ...
CROSS APPLY
(
   SELECT TOP 1 employee , dept_no FROM emp_dept 
   WHERE employee = !EMP FROM MAIN TABLE!
   ORDER BY to_date DESC
) AS last_dept 

!EMP 来自主表!是CROSS APPLY 之前表格中的员工值 (发布您到目前为止的完整查询,以获得更完整的答案)

【讨论】:

【参考方案3】:

您可以在子查询中获取最大日期并加入它。

您在 emp_dept 表条目中似乎有错字,emp_no 与employees 表不匹配。

如果员工目前在部门工作,to_date 是否会为 NULL?

这种情况需要在子查询中处理。

SELECT e.emp_no, e.emp_name, ED.dept_no
FROM 
(
   SELECT emp_no, max(to_date) as maxDate
   FROM emp_dept 
   group by emp_no)T
JOIN employee e
ON T.emp_no = e.emp_no
JOIN emp_dept ED
on T.maxDate = ED.t_date
AND ED.emp_no = T.emp_no

【讨论】:

你需要在派生表中分组 我收到此错误消息:错误代码:1054。“on 子句”中的未知列“ED.maxDate” @swordf1zh,应该是T.maxDate,现在可以试试吗? @RADAR 现在可以工作了,但是使用这种方法来包含来自多个联结表的数据更加复杂。我正在使用另一组类似的表来管理“角色”,并且还希望在结果表中包含角色信息。

以上是关于查询表中的所有数据,仅连接联结表中的最新记录的主要内容,如果未能解决你的问题,请参考以下文章

外连接查询

MySQL8:连接查询

mysql左连接右连接(查询两张表不同的数据)

如何从重复记录中检索mysql表中的最新数据

mysql左连接右连接(查询两张表不同的数据)

将所有记录插入到 Symfony 中的联结表中