但这对每一行都执行子查询,并且效率很低
首先,您是否有一个证明这一点的查询计划/时间安排?您完成操作的方式(使用子选择)几乎是执行操作的“直观”方式。许多DBMS(尽管我不确定MysqL)都针对这种情况进行了优化,并且将只能执行一次查询。
另外,您应该能够仅使用一个(user id, latest email id)
元组创建一个子表,并JOIN
在其上:
SELECT
users.userId
, users.username
, userEmail.email
FROM users
INNER JOIN
(SELECT userId, MAX(emailId) AS latestemailId
FROM userEmail GROUP BY userId)
AS latestemails
ON (users.userId = latestemails.userId)
INNER JOIN userEmail ON
(latestemails.latestemailId = userEmail.emailId)
ORDER BY users.username;