MySQL时间记录系统

3

我有一个时间表,包含以下元素(id(pk)actionemp_id(fk)time)。

如果我将emp_id传递给查询,如何选择最新的操作?

id  emp_id  action  current_time
-----------------------------------------------
1   1   clockin     2012-01-29 21:52:38
2   1   clockout    2012-01-29 21:54:24
3   3   clock in    2012-01-30 21:10:51
4   4   clock in    2012-01-30 21:10:51
5   9   clock in    2012-01-30 21:11:05
6   10  clock in    2012-01-30 21:11:05
7   10  go to meal  2012-01-30 21:11:38
8   9   go to meal  2012-01-30 21:11:38
9   9   back        2012-01-30 21:12:53
10  3   back        2012-01-30 21:12:53
11  2   back        2012-01-30 21:12:53
12  1   back        2012-01-30 21:12:53

如果我这样写我的查询语句:
SELECT MAX(ID) FROM timeclock WHERE emp_id = 1 

我得到了12,这是正确的,但如果我

(暂缺上下文无法翻译完整意思)
SELECT MAX(ID) , action FROM timeclock WHERE emp_id = 1

我得到的是id->12action -> 'clockin'而不是'back',这绝对是不正确的。

1个回答

0
你的MAX()聚合函数缺少一个GROUP BY子句。你第一次查询尝试得到正确答案12仅仅是因为这恰好是表中最大的ID,同时也巧合地属于emp_id = 1。对于任何emp_id值,你都会得到相同的结果。添加一个GROUP BY子句可以解决这个问题。
以下是一个示例,检索关联记录的整行:
SELECT * FROM timeclock 
WHERE id = (SELECT MAX(id) AS id FROM timeclock WHERE emp_id = 1 GROUP BY emp_id);

这也可以通过使用 HAVING 子句来实现,而不需要子查询:

SELECT action 
FROM timeclock 
WHERE emp_id = 1
GROUP BY emp_id
HAVING id = MAX(id);

作为参考,MySQL聚合函数参考。


工作正常,谢谢Michael。我在w3schools.com上查看了这个,这让我更容易理解。 - user1170618

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接