gpt4 book ai didi

MySQL 检索员工在场

转载 作者:行者123 更新时间:2023-11-29 01:51:55 25 4
gpt4 key购买 nike

我需要检索当天的员工出席情况。在场中有两种状态:In & Out。如果员工不在场,则它应该以 null 状态进行检索。

我有两个表,EmployeesPresences,我想加入它们。

ID  |  name  
1 John
2 Julie
3 Anthony
4 Joseph

现在 presences 表有以下数据:

ID  |  employee_id  |  presence_date     |  presence_hour   |  Movement  
1 1 2016-08-30 08:55 In
2 2 2016-08-30 08:56 In
3 3 2016-08-30 08:57 In
4 1 2016-08-30 12:33 Out
5 2 2016-08-30 12:34 Out

如您在状态数据中所见,员工 Anthony 尚未离开办公室,员工 Joseph 在表中没有任何条目。

我期待的结果:

Employee  |  Movement  
John Out
Julie Out
Anthony In
Joseph null

我正在使用的查询:

SELECT employee.name, presence.movement
FROM employees AS employee
LEFT JOIN presences AS presence ON presence.employee_id = employee.id
WHERE presence.presence_date = '2016-08-30' AND
employee.id IN (1, 2, 3, 4)
GROUP BY employee.id
ORDER BY employee.name, presence.id DESC

我面临的问题:

  1. 约瑟夫从未出现在数据中
  2. presence.id DESC 不起作用

最佳答案

因为 Joseph presence.presence_datenull,所以它与 presence.presence_date = '2016-08-30' 不匹配。

order by presence.id 对我来说毫无意义。您按员工分组,因此 presence 中该员工的所有匹配行都合并在一起。您想要根据 presence.id 对所有这些进行排序并选择最近的行 movement 值?这与您编写的方式不同。一种解决方案是在您的查询中使用 MAX(presence.id) 来获取当前员工的最近一行 presence 的 ID,然后加入 presence table again 以获取您想要的数据。

SELECT a.name, b.movement
FROM (
SELECT employee.name, MAX(presence.id) max_id
FROM employees AS employee
LEFT JOIN presences AS presence
ON presence.employee_id = employee.id WHERE presence.presence_date = '2016-08-30' AND
employee.id IN (1, 2, 3, 4)
GROUP BY employee.id
) a
LEFT JOIN presence b ON a.max_id = b.id
ORDER BY a.name

尽管假定 most recent 等同于 biggest id 可能不是一个好主意,因此人们可能会选择具有最近日期的行,但是这又是一个“问题”。

关于MySQL 检索员工在场,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39246012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com