如何从许多用户余额中获得最新余额?

时间:2016-01-14 14:28:39

标签: mysql sql

我有两张表userstransactionstransactions表与用户有两种表格式,如下所示

users 
id  name    email        created
1   a       a@mail.com   12-03-01
2   b       b@mail.com   11-03-01


Transactions
id   user_id  balance 
1    1        250 
2    1        550 
3    2        50 
4    2        1000 

我需要最后从事务表中插入用户余额和所有用户信息。我是sql的新手。

所以我试过下面的代码

select * from transactions 
where id in (select max(id) from transactions group by user_id)
INNER JOIN users on transactions.user_id=users.id

它在内部联接附近给出了语法错误。我在内部联接中犯了什么错误?或者我的方向错了?

3 个答案:

答案 0 :(得分:1)

如果您只想要余额,那么相关子查询可能会更快:

select u.*,
       (select t.balance
        from transactions t
        where t.user_id = u.id
        order by t.id desc
        limit 1
       ) as MostRecentBalance
from users u;

为获得最佳性能,您需要transactions(user_id, id desc, balance)上的索引。

这个更快的原因是因为它避免了整个transactions表的聚合。如果您只选择一部分用户,这一点就更为重要。

编辑:

我最初将这个问题看作每个用户一行。但是,如果您只想返回一行 - 最后一次插入transactions - 那么更简单的方法是:

select u.*, t.balance
from users u join
     transactions t
     on u.id = t.user_id
order by t.id desc
limit 1;

答案 1 :(得分:0)

JOIN应该是FROM语句的一部分,所以它应该看起来更像下面的代码。

select * 
from transactions ts
INNER JOIN users 
ON (transactions.user_id=users.id)
where ts.id in 
           (
             select max(transactions.id) 
             from transactions 
             group by user_id
           );

编辑以根据Gordons建议澄清哪个ID正在使用

答案 2 :(得分:0)

2种简单的方法。

获取最新事务的子查询,以及所有事务详细信息,然后是用户

SELECT users.*
FROM users
INNER JOIN transactions
ON users.id = transactions.user_id
INNER JOIN
(
    SELECT MAX(id) AS max_id
    FROM transactions
) sub0
ON transactions.id = sub0.max_id

或者您可以尝试按ID下降,限制为1: -

SELECT users.*
FROM users
INNER JOIN transactions
ON users.id = transactions.user_id
ORDER BY transactions.id DESC
LIMIT 1

修改

要获取所有用户的最后一笔交易,您可以使用以下内容: -

SELECT *
FROM users
INNER JOIN transactions
ON users.id = transactions.user_id
INNER JOIN
(
    SELECT user_id, MAX(id) AS max_id
    FROM transactions
    GROUP BY user_id
) sub0
ON transactions.id = sub0.max_id
ON transactions.user_id = sub0.user_id