我知道有很多与此相关的主题。我试过研究它们,但我无法做到这一点。
我有一个以下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
获得所需输出的正确查询应该是什么?
答案 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
);