我有这张桌子
反
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借记11.00 45.00 2013-07-18 00:00:00 6 2借记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
)
这为每个用户提供了两条记录,而不是每条记录。我做错了什么?
目标是选择最高金额(最高和最低)
如果两个日期和时间相同,但每个
不返回两个记录,则可以答案 0 :(得分:2)
如果您使用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
答案 1 :(得分: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
。