题解 | 牛客每个人最近的登录日期(四)

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

http://www.nowcoder.com/practice/e524dc7450234395aa21c75303a42b0a

子查询:因为要查询的是每天登录的新用户的人数,而新用户指的是一个用户的首次登录时间为该天的用户,所以查询的思路就是在 主查询date 分组,然后在子查询中找出,最小的登登录日期为 主查询date 记录的用户的个数,所以 子查询 的任务就是找出最小登录日期为 主查询date 记录的用户的个数

SELECT `date`, 
(
    SELECT COUNT(*)
    FROM
    (
        SELECT user_id
        FROM login inner_login
        GROUP BY user_id
        HAVING MIN(`date`) = outer_login.date
    )t
)
FROM login outer_login
GROUP BY `date`
ORDER BY `date`;

外连接:想法和上面的一样,都是找到用户的最小的登录日期,只是由嵌套子查询的写法改成外连接子查询中间表。第一个 子查询 将日期取出。第二个子查询则是按照 user_id 分组,查询每个用户的最小登录日期,然后对两张子查询的中间表进行一次 外连接,这样日期当天所有第一次登录的用户就和该日期连接起来啦,如果某个日期当天没有任何用户登录,那么该日期对应的用户为 NULL,最后使用 COUNT 函数时被记为 0

SELECT t1.date, COUNT(t2.user_id)
FROM 
(
    SELECT DISTINCT `date`
    FROM login
)t1
LEFT JOIN 
(
    SELECT user_id, MIN(date) min_date 
    FROM login
    GROUP BY user_id
)t2
ON t1.date = t2.min_date
GROUP BY t1.date
ORDER BY t1.date;
全部评论

相关推荐

12-11 14:24
门头沟学院 Java
牛客35720396...:不要用boss,全是骗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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