我想为以下加入提供一些帮助。 我有一个表(大约有2000万行),包括:
MemberId(主键)| Id(主键)| TransactionDate |平衡
我想在一个查询中为所有客户获取最新的余额。 我知道我可以做这样的事情(我只是从记忆中写下来的)。但这种方式非常慢。
SELECT *
FROM money
WHERE money.Id = (SELECT MAX(Id)
FROM money AS m
WHERE m.MemberId = money.MemberId)
还有其他(更快/更智能)选项吗?
答案 0 :(得分:5)
在我经历过的所有优化教程和截屏视频中,连接总是优于子查询。使用子查询时,每次比较都会执行子查询,而连接只执行一次。
SELECT *
FROM money m
INNER JOIN (
SELECT memberId, MAX(id) AS maxid
FROM money
GROUP BY memberId
) mmax ON mmax.maxid = m.id AND mmax.memberId = m.memberId
答案 1 :(得分:2)
加入并不是解决这个问题的最好方法。考虑使用GROUP BY子句筛选每个成员的最后一个事务,如下所示:
SELECT MemberId,MAX(Id),TransactionDate,Balance FROM money GROUP BY MemberId
<强>更新强>
PKK指出,平衡将随机选择。看起来你必须执行某种连接。考虑这个选项:SELECT MemberId, Id, TransactionDate, Balance FROM money WHERE Id IN (
SELECT MAX(Id) FROM money GROUP BY MemberId
)
答案 2 :(得分:0)
其他选项是在左连接中查找NULL值:
SELECT m1.*
FROM money m1
LEFT JOIN money m2 ON m2.memberId = m1.memberId AND m2.id > m1.id
WHERE m2.memberId IS NULL
但当然Umbrella's answer更好。