使用Inner Join关联表取最大日期,查询每个用户最新疾病日志记录
解法1:使用窗口函数(推荐,支持MySQL 8.0+/PostgreSQL/SQL Server等主流数据库)
先给每个用户的日志按date字段倒序排序,取每个用户排序第一的记录,再关联用户表即可:
SELECT u.id, u.name, dl.id AS logId, dl.logType, dl.date FROM Users u INNER JOIN ( SELECT *, ROW_NUMBER() OVER (PARTITION BY userId ORDER BY date DESC) AS rn FROM Diseaselogs ) dl ON u.id = dl.userId AND dl.rn = 1;
如果同一个用户存在多条date相同的最大日期记录,希望全部返回的话,把ROW_NUMBER()换成RANK()即可。
解法2:子查询适配低版本数据库(如MySQL 5.x)
先查询出每个用户的最大日志日期,再两次关联取对应记录:
SELECT u.id, u.name, dl.id AS logId, dl.logType, dl.date FROM Users u INNER JOIN ( SELECT userId, MAX(date) AS max_date FROM Diseaselogs GROUP BY userId ) max_dl ON u.id = max_dl.userId INNER JOIN Diseaselogs dl ON dl.userId = u.id AND dl.date = max_dl.max_date;
注意这个方法如果同一个用户有多个相同最大日期的日志,会全部返回,和使用RANK()的效果一致。
两种方法执行后都可以得到你需要的预期输出结果。
内容的提问来源于stack exchange,提问作者poppy
相关产品推荐
相关产品推荐

