【发布时间】:2018-04-22 23:10:23
【问题描述】:
tl:博士 我需要从一个表中获取每个员工的最新行,并将其与另一个表中每个员工的多行匹配。我能够从一张表中获取每位员工的最新条目,但无法从第二张表中提取数据。
详情:
前两个表显示了我数据库中的一些代表性数据。此处显示的数据和表格是我的完整架构和数据集的 sn-ps。 (表格:'employees' 和 'employee_payrollhours')
employee_number:这是一个 ID 号,用于识别单个员工 insert_at:这是记录保存到数据库时的日期/时间戳 datetime_in:这是员工开始轮班的日期/时间
SELECT employee_number, last_name, inserted_at FROM employees;
TABLE: employees
+-----------------+-------------+---------------------+
| employee_number | last_name | inserted_at |
+-----------------+-------------+---------------------+
| 123456789 | Lastone | 2018-02-26 22:26:38 |
| 123456789 | Lastone | 2018-03-15 15:16:14 |
| 123456789 | Lastone | 2018-03-15 20:57:23 |
| 123456789 | Lastone | 2018-04-16 00:10:27 |
| 223456789 | Lasttwo | 2018-04-16 03:37:49 |
| 270000001 | Lastthree | 2018-04-06 22:42:50 |
| 270000001 | Lastthree | 2018-04-17 14:10:01 |
+-----------------+-------------+---------------------+
SELECT employee_number, datetime_in FROM employee_payrollhours
TABLE: employee_payrollhours
+-----------------+---------------------+
| employee_number | datetime_in |
+-----------------+---------------------+
| 123456789 | 2018-04-06 08:00:00 |
| 123456789 | 2018-04-08 08:00:00 |
| 123456789 | 2018-04-10 08:00:00 |
| 123456789 | 2018-04-15 08:00:00 |
| 123456789 | 2018-04-17 08:00:00 |
| 123456789 | 2018-04-19 08:00:00 |
| 223456789 | 2018-04-06 08:00:00 |
| 223456789 | 2018-04-08 08:00:00 |
| 223456789 | 2018-04-10 08:00:00 |
| 223456789 | 2018-04-15 08:00:00 |
| 223456789 | 2018-04-17 08:00:00 |
| 223456789 | 2018-04-19 08:00:00 |
| 270000001 | 2018-04-07 08:00:00 |
| 270000001 | 2018-04-09 08:00:00 |
| 270000001 | 2018-04-11 08:00:00 |
| 270000001 | 2018-04-16 08:00:00 |
+-----------------+---------------------+
从员工中为每个员工获取一行
SELECT * FROM employees GROUP BY last_name
并从员工表中获取每个员工的最新条目。
SELECT * FROM employees e1
WHERE Inserted_at =
(SELECT MAX(e2.Inserted_at)
FROM employees e2
WHERE e1.Employee_Number = e2.Employee_Number)
+-----------------+-------------+---------------------+
| employee_number | last_name | inserted_at |
+-----------------+-------------+---------------------+
| 123456789 | Lastone | 2018-04-16 00:10:27 |
| 223456789 | Lasttwo | 2018-04-16 03:37:49 |
| 270000001 | Lastthree | 2018-04-17 14:10:01 |
+-----------------+-------------+---------------------+
这就是我想要的。我希望“employees”中每个员工的最新条目与“employee_payrollhours”表中的相应员工数据一起显示。
+-------------------+---------------------+
| last_name | datetime_in |
+-------------------+---------------------+
| Lastone | 2018-04-06 08:00:00 |
| Lastone | 2018-04-08 08:00:00 |
| Lastone | 2018-04-10 08:00:00 |
| Lastone | 2018-04-15 08:00:00 |
| Lastone | 2018-04-17 08:00:00 |
| Lastone | 2018-04-19 08:00:00 |
| Lasttwo | 2018-04-06 08:00:00 |
| Lasttwo | 2018-04-08 08:00:00 |
| Lasttwo | 2018-04-10 08:00:00 |
| Lasttwo | 2018-04-15 08:00:00 |
| Lasttwo | 2018-04-17 08:00:00 |
| Lasttwo | 2018-04-19 08:00:00 |
| Lastthree | 2018-04-07 08:00:00 |
| Lastthree | 2018-04-09 08:00:00 |
| Lastthree | 2018-04-11 08:00:00 |
| Lastthree | 2018-04-16 08:00:00 |
+-------------------+---------------------+
这个查询给了我错误“子查询返回超过 1 行”
SELECT employees.*, employee_payrollhours.*
FROM employees, employee_payrollhours
WHERE employee_payrollhours.employee_number = (select employee_number from employees group by last_name);
这个查询给了我混合的数据。
SELECT employees.last_name, employees.employee_number, employee_payrollhours.employee_number, employee_payrollhours.datetime_in
FROM employees, employee_payrollhours
WHERE employee_payrollhours.employee_number = employees.employee_number;
这个查询给了我零个返回结果
SELECT * FROM employees e1, employee_payrollhours
WHERE `e1`.`Inserted_at` =
(SELECT MAX(e2.Inserted_at)
FROM employees e2
WHERE e1.Employee_Number = e2.Employee_Number)
AND (`e1`.`Inserted_at` =
(SELECT MAX(e2.Inserted_at)
FROM employees e2
WHERE e1.Employee_Number = e2.Employee_Number)) = employee_payrollhours.Employee_Number;
有人能给我一些指导,告诉我如何解决这个问题以找到我需要的查询吗?
提前谢谢你。
【问题讨论】:
标签: mysql