mysql - 将子查询转换为连接

标签 mysql sql sql-server

我有三个表:userProfileloginTimesorders

我正在尝试获取每个用户的个人资料行、他的上次登录时间和他的上次订单行。

这是我的查询:

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

Working on SQLFiddle

关于mysql - 将子查询转换为连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20250949/

相关文章:

sql - 条件 where Sql 服务器

mysql - 代码点火器 :Using defined constants for table names in a join call

database - Mysql服务无法启动,InnoDB init函数错误

mysql - 仅在数据更改时触发的更新触发器后 MySQL 中的 NULL 处理

sql - 为什么我应该避免 SQL 数据库中的 NULL 值?

sql - 从SQL存储过程中提取毫秒数据

mysql问题: is there something like IN ALL query?

SQL Server 优化器删除 ISNULL 调用

sql-server - 如何在查询链接服务器中输入ip

c# - 随机 SQL 连接问题。工作,然后不工作,然后工作,然后 BAM!永远不会再工作?