0

我有这张桌子

反式

id
user_id
amt
desc
bal
created

样本数据是

id  user_id desc    amt     bal     created
1   1   credit  12.00   12.00   2013-07-02 00:00:00
2   1   credit  44.00   56.00   2013-07-09 00:00:00
3   1   debit   11.00   45.00   2013-07-18 00:00:00
4   2   credit  11.00   11.00   2013-07-12 01:17:08
5   2   credit  45.00   56.00   2013-07-13 01:17:08
6   2   debit   15.00   41.00   2013-07-14 01:17:08
7   3   credit  33.00   33.00   2013-07-15 01:17:52
8   3   credit  45.00   78.00   2013-07-16 01:17:52
9   3   debit   25.00   53.00   2013-07-17 01:17:52

现在我只需要从每个用户中选择当前余额,所以 outout 应该 输出 id user_id desc amt bal created 3 1 debit 11.00 45.00 2013-07-18 00:00:00 6 2 debit 15.00 41.00 2013-07-12 01 :17:08 9 3 学分 25.00 53.00 2013-07-12 01:17:52

这是我试过的

SELECT * 
FROM trans
WHERE created
IN (

SELECT MAX( created ) 
FROM trans
GROUP BY user_id
)

这为每个用户提供了两条记录,而不是每条记录。我究竟做错了什么?

目标是选择最高金额(最高和递减)

如果两个日期和时间相同,则可以,但每个不返回两条记录

4

2 回答 2

2

如果您使用 a ,我会发现这更简单JOIN

SELECT t.*
FROM trans t
   INNER JOIN (
       SELECT Max(Id) MaxId
       FROM trans
       GROUP BY User_Id
   ) t2 ON t.Id = t2.MaxId

这假设MAX(Id)是您为每个用户寻找的最大记录(并且是唯一的)。如果没有,您可以使用MAX(created)相同User_Id的方式,但如果时间相同,每个用户可能会产生多个结果。例如:

SELECT t.*
FROM trans t
   INNER JOIN (
       SELECT Max(created) MaxCreated, User_Id
       FROM trans
       GROUP BY User_Id
   ) t2 ON t.User_Id = t2.User_Id AND t.Created = t2.MaxCreated
于 2013-07-12T01:12:21.823 回答
0

一个好的解决方案是;

SELECT user_id, SUM(IF(desc='credit',-1,1)*amt) AS balance 
FROM trans GROUP BY user_id

您建议的表格设计得不好。您真的应该存储每一行​​的余额,因为这会在您的数据中引入不一致。如果个人amt不同意这些bal字段会怎样?仅存储amt字段。如果您删除该desc列并将学分存储为负数,则会更简单。在这种情况下,您只需选择SUM(amt) AS balance.

于 2013-07-12T01:11:21.437 回答