使用MAX和GROUP BY从表中提取数据

时间:2013-07-29 09:37:35

标签: php mysql sql group-by max

我正在尝试从表中提取数据。为了简化,我有一个表(time_entries)有3个colums user_name,entry_type和entry_datetime

这是一个示例输出

user_name| entry_type   | entry_datetime
 User1   |   Time In    | 28-JUL-13  16:40:40
 User1   |   Time Out   | 28-JUL-13  16:40:41
 User2   |   Time In    | 28-JUL-13  16:41:13
 User2   |   Time Out   | 28-JUL-13  16:41:15
 User3   |   Time In    | 28-JUL-13  16:42:32

我在这里要做的是在每个用户最后一次登录时拉出结果

我的查询

SELECT te.user_name, te.entry_type,  MAX(te.entry_datetime) AS date
FROM time_entries AS te
GROUP BY te.user_name 

只有错误的结果才能正常运行,这是

下面的输出

输出

user_name| entry_type | entry_datetime
User1    | Time In    | 28-JUL-13 16:40:41
User2    | Time In    | 28-JUL-13 16:41:15
User3    | Time In    | 28-JUL-13 16:42:32

user_name和entry_datetime是正确的,但entry_type都是Time In。 User1和User2 entry_type必须是超时。

任何人都知道这个问题的解决方案?

3 个答案:

答案 0 :(得分:3)

您可以使用过滤联接列出每个用户的最新条目:

select  *
from    time_entries te
join    (
        select  user_name
        ,       max(entry_datetime) as maxdt
        from    time_entries
        group by
                user_name
        ) filter
on      filter.user_name = te.user_name
        and filter.maxdt = te.entry_datetime

Working example at SQL Fiddle.

答案 1 :(得分:1)

我没有测试过这个,但它可能是这样的

SELECT 
   te.user_name as name, 
   MAX(te.entry_datetime) AS date, 
   (SELECT te2.entry_type 
       FROM time_entries AS te2 
       WHERE te2.user_name = name AND te2.entry_datetime = date)
FROM 
   time_entries AS te
GROUP BY 
   te.user_name 

答案 2 :(得分:1)

试试这个......

SELECT te.user_name, te.entry_type,  te.entry_datetime
FROM time_entries AS te
WHERE te.entry_datetime IN (SELECT MAX(te2.entry_datetime)
                            FROM FROM time_entries AS te2
                            WHERE te2.user_name = te.user_name)

这假设不存在具有重复值entry_datetime

的条目