我有一个包含以下元素的时钟表(id(pk)
,action
,emp_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->12
和action -> 'clockin'
代替'back'
,这绝对不是正确的
答案 0 :(得分:0)
您错过了GROUP BY
汇总的MAX()
条款。您第一次尝试查询时得到正确答案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);