我有三个表:userProfile
、loginTimes
、orders
。
我正在尝试获取每个用户的个人资料行、他的上次登录时间和他的上次订单行。
这是我的查询:
Select u.*, t.loginTime, orders.* From userProfiles u
Inner Join
(Select userId, MAX(time) loginTime From loginTimes Group By userID) t
On u.userId = t.userID
Inner Join
(Select userId, MAX(enterDate) orderDate From orders Group By userId) o
On u.userID = o.userID
Inner Join
orders On orders.userId = u.userId And orders.enterDate = o.orderDate
有没有办法重写而不需要那么多子查询?
最佳答案
OP 我认为这就是您想要的查询,这仍然需要 2 个子查询,但我不相信您的原始查询按预期运行。
您可以删除 loginTimes
子查询,并在外部 SELECT
列表中使用 MAX(loginTime)
,但随后您需要GROUP BY
order
表中的每个字段,这可以说同样不干净。
以下查询检索用户最近订单的 UserId
、最新 LoginTime
以及整个 order
记录:
SELECT u.userId,
u.userName,
l.loginTime,
o.*
FROM userProfiles u
INNER JOIN ( SELECT userId,
loginTime = MAX(time)
FROM loginTimes
GROUP BY userID) l ON u.userId = l.userId
INNER JOIN ( SELECT *,
rowNum = ROW_NUMBER() OVER (PARTITION BY userId
ORDER BY enterDate DESC)
FROM orders) o ON u.userId = o.userId AND o.rowNum = 1
关于mysql - 将子查询转换为连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20250949/