Php 从多个值中选择顶部值

Php 从多个值中选择顶部值,php,mysql,sql,subquery,Php,Mysql,Sql,Subquery,我有这张桌子 trans 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

我有这张桌子

trans

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
样本数据为

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用户\u id描述创建的余额金额 借方11.00 45.00 2013-07-18 00:00:00 借15.0041.002013-07-1201:17:08 信用证25.0053.002013-07-1201:17:52

这就是我试过的

SELECT * 
FROM trans
WHERE created
IN (

SELECT MAX( created ) 
FROM trans
GROUP BY user_id
)
这将为每个用户提供两条记录,而不是每个用户1条。我做错了什么

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

如果两个日期和时间相同,但不分别返回两条记录就可以了,这是一个好的解决方案

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

你建议的桌子设计得不好。您确实应该而不是存储每行的余额,因为这可能会导致数据不一致。如果个人
amt
bal
字段不一致,会发生什么情况?仅存储
amt
字段。如果您删除
desc
列并将积分存储为负数,则会更简单。在这种情况下,您只需选择
SUM(amt)作为余额

如果您使用
联接
,我发现这更简单:

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\u 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

您正在从trans中选择,但在外部的
SELECT
中没有
groupby
。所以现在您不想要余额,而是想要最大的存款?你似乎在做一些涉及金钱的事情。。。如果这不仅仅是一个玩具项目,那么您需要考虑这个问题。非常感谢,但我发现您的解决方案只是选择最新的trans,而不是amt的最高trans值。你能帮我纠正一下吗