三表聚合,然后where进行筛选
牛客每个人最近的登录日期(二)
http://www.nowcoder.com/practice/7cc3c814329546e89e71bb45c805c9ad
- 首先明确出要查询的目标:
用户名, ---> 来自于用户表
客户端名, ---> 来自于客户端表
date ---> 来自于login表 - 然后目标明确,进行三表聚合:
SELECT u.name as u_n, c.name as c_n, l.date from login l join user u on l.user_id=u.id join client c on l.client_id=c.id
- 根据题意筛选出目标行:
不能直接使用max(date)选出最近的登录记录,问题在于这里的max(date)是最近时间,但是这个最近时间不和前面的数据有联系;比如:select id,max(date) from login,这里面id和max(date)没有联系,是所有行的最大值;
所以,只能在where中筛选出数据:SELECT u.name as u_n, c.name as c_n, l.date from login l join user u on l.user_id=u.id join client c on l.client_id=c.id where (l.user_id,l.date) in (select user_id,max(date) from login group by login.user_id) order by u.name;
总结:也就是说,(select user_id,max(date) from login group by login.user_id)
查询出了每组的 user_id ,组内的max(date);