我有两张表users
和transactions
。 transactions
表与用户有两种表格式,如下所示
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
它在内部联接附近给出了语法错误。我在内部联接中犯了什么错误?或者我的方向错了?
答案 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