如何通过MySQL查询(不是第一个)获取组中的最后结果

时间:2013-08-23 11:00:38

标签: mysql sql

我有下表:

+--+-------------------+---------------------+-----------------------+
|ID| lt_user           | lt_time_stamp       | lt_activity_operation |
+--+-------------------+---------------------+-----------------------+
|1 | External Sales    | 2013-02-15 15:17:34 | login                 |
|2 | External Sales    | 2013-03-20 16:25:09 | login                 |
|3 | Internal Sales    | 2013-07-29 13:09:22 | login                 |
|4 | Internal Sales    | 2013-08-01 11:06:11 | login                 |
|5 | Internal sales    | 2013-08-02 10:06:59 | login                 |
|6 | internal sales    | 2013-08-02 10:21:38 | login                 |
|7 | internal sales    | 2013-08-07 16:13:01 | login                 |
|8 | Internal Sales    | 2013-08-12 10:51:16 | login                 |
+--+-------------------+---------------------+-----------------------+

我正在尝试检索每个用户的最后一个实例(时间戳)。

我需要的是:

+--+-------------------+---------------------+-----------------------+
|ID| lt_user           | lt_time_stamp       | lt_activity_operation |
+--+-------------------+---------------------+-----------------------+
|2 | External Sales    | 2013-03-20 16:25:09 | login                 |
|8 | Internal Sales    | 2013-08-12 10:51:16 | login                 |
+--+-------------------+---------------------+-----------------------+

我得到的是:

+--+-------------------+---------------------+-----------------------+
|ID| lt_user           | lt_time_stamp       | lt_activity_operation |
+--+-------------------+---------------------+-----------------------+
|3 | Internal Sales    | 2013-07-29 13:09:22 | login                 |
|1 | External Sales    | 2013-02-15 15:17:34 | login                 |
+--+-------------------+---------------------+-----------------------+

我的查询是:

SELECT lt_user, lt_time_stamp, lt_activity_operation
  FROM log_table
 GROUP BY lt_user
 ORDER BY lt_time_stamp DESC;

由于

5 个答案:

答案 0 :(得分:1)

尝试使用MAX()

SELECT lt_user, MAX(lt_time_stamp), lt_activity_operation 
FROM log_table GROUP BY lt_user, lt_activity_operation;

请参阅this SQLFiddle

答案 1 :(得分:0)

限制版本:

SELECT lt_user, lt_time_stamp, lt_activity_operation 
FROM log_table GROUP BY lt_user, lt_activity_operation 
ORDER BY lt_time_stamp DESC LIMIT 1;

答案 2 :(得分:0)

获取最后一行的正确方法是进行聚合以获取max()值,然后重新连接回原始数据:

select lt.*
from (SELECT lt_user, max(lt_time_stamp) as maxts
      FROM log_table
      GROUP BY lt_user 
     ) ltsum join
     log_table lt
     on ltsum.lt_user = lt.user and ltsum.maxts = lt.lt_time_stamp;

在这种情况下,您只需要获取最后一个活动。你也可以用这个技巧来做到这一点:

SELECT lt_user, max(lt_time_stamp) as maxts,
       substring_index(group_concat(lt_activity_operation order by lt_time_stamp desc), ',', 1
                      ) as last_activity
FROM log_table
GROUP BY lt_user;

答案 3 :(得分:0)

像这样使用

SELECT lt_user, MAX(lt_time_stamp), lt_activity_operation FROM log_table GROUP BY lt_user, lt_activity_operation ORDER BY lt_time_stamp DESC;

答案 4 :(得分:0)

使用GROUP BY命令时,您需要告诉SQL应该显示所选记录中的哪一个,因为它会占用所有记录并将它们分组到每个分组记录的一个结果记录中。因此,您需要为其选择MAX()或任何其他特定函数或参数(在您的情况下,时间戳)。

    SELECT lt_user, MAX(lt_time_stamp), lt_activity_operation
      FROM log_table
     GROUP BY lt_user
     ORDER BY lt_time_stamp DESC;
如果

lt_activity_operation列完全相同(在数据库中登录),则不需要函数,但如果它出现,可能需要选择与lt_time_stamp相同的方式。