题解 | 牛客每个人最近的登录日期(四)
牛客每个人最近的登录日期(四)
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;