我需要检索当天员工的状态。存在状态有两种:In&Out。如果员工没有在场,则应以空状态检索。
我有两个表,Employees
并且Presences
我想加入他们。
ID | name
1 John
2 Julie
3 Anthony
4 Joseph
现在状态表具有以下数据:
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
我面临的问题:
presence.id DESC
不起作用这是由于在where条件中应用了日期过滤器引起的。加入后应用where标准,从而消除了Joseph的任何记录,因为他当天没有在场。而是将日期条件移到加入条件。
您完全group by
错了,您的查询违反了sql标准,因为选择列表中的列不在分组依据列表中,并且不是聚合函数的主题,例如max()
。MySQL仅允许在某些sql模式设置下进行此类查询。用于max()
员工名称和日期字段的移动和分组。
示例查询,假设您每个员工每天只能进出一出:
SELECT employee.name, max(presence.movement) as movement
FROM employees AS employee
LEFT JOIN presences AS presence ON presence.employee_id = employee.id and date(presence.presence_date) = '2016-08-30'
WHERE employee.id IN (1, 2, 3, 4)
GROUP BY employee.name, date(presence.presence_date)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句