三表聚合,然后where进行筛选

牛客每个人最近的登录日期(二)

http://www.nowcoder.com/practice/7cc3c814329546e89e71bb45c805c9ad

  1. 首先明确出要查询的目标:
    用户名, ---> 来自于用户表
    客户端名, ---> 来自于客户端表
    date ---> 来自于login表
  2. 然后目标明确,进行三表聚合:
    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 
  3. 根据题意筛选出目标行:
    不能直接使用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);
全部评论

相关推荐

流浪的神仙:无恶意,算法一般好像都得9硕才能干算法太卷啦
点赞 评论 收藏
分享
05-09 14:45
门头沟学院 Java
点赞 评论 收藏
分享
06-19 14:58
门头沟学院 Java
点赞 评论 收藏
分享
评论
15
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务