选择最大日期时间返回错误值

时间:2018-05-28 15:41:33

标签: mysql sql max aggregate-functions

我知道有很多与此相关的主题。我试过研究它们,但我无法做到这一点。

我有一个以下lunch_transaction表:

id  |  user_id  |  date               |  due_amount  |  updated_on
---------------------------------------------------------------------------
1   |      145  | 2018-05-28 12:56:46 |   30.00      | 2018-05-28 12:56:46
2   |      134  | 2018-05-28 13:33:02 |   30.00      | 2018-05-28 13:33:02
3   |      134  | 2018-05-28 13:38:50 |   60.00      | 2018-05-28 13:38:50
4   |      134  | 2018-05-28 13:38:59 |   60.00      | 2018-05-28 13:38:59
5   |      134  | 2018-05-30 13:39:17 |   60.00      | 2018-05-28 13:39:17
6   |      145  | 2018-05-30 15:20:00 |   45.00      | 2018-05-28 15:00:17

我想获得每个用户的最新日期时间记录。

因此,期望的输出应为:

145  | 2018-05-30 15:20:00 |   45.00      | 2018-05-28 15:00:17
134  | 2018-05-30 13:39:17 |   60.00      | 2018-05-28 13:39:17

但我得到以下输出:

145  | 2018-05-30 15:20:00 |   30.00      | 2018-05-28 12:56:46
134  | 2018-05-30 13:39:17 |   30.00      | 2018-05-28 13:33:02

即使列值不是同一行,也就是看起来结果集中的字段值是从不同的行混合而来。

这是我的疑问:

SELECT user_id, MAX(date), due_amount, updated_on 
FROM lunch_transaction 
GROUP BY user_id

获得所需输出的正确查询应该是什么?

2 个答案:

答案 0 :(得分:1)

您当前的查询是在正确的轨道上,但为了使该方法有效,您需要将原始表格加入其中,以过滤掉每个用户不是最大值的记录:

SELECT t1.*
FROM lunch_transaction t1
INNER JOIN
(
    SELECT user_id, MAX(date) AS max_date
    FROM lunch_transaction 
    GROUP BY user_id
) t2
    ON t1.user_id = t2.user_id AND t1.date = t2.max_date;

答案 1 :(得分:1)

由于您拥有身份id)列,因此您可以通过subquery limit子句利用它:

select lt.*
from lunch_transaction lt
where id = (select lt1.id
            from lunch_transaction lt1
            where lt.user_id = lt1.user_id
            order by date lt1.desc
            limit 1
           );