这道题目要求我们查询每天最早登录的用户及其内容喜好。我们要做的事情如下:

1. 确定总体问题

我们需要找出每一天最早登录的用户,并输出他们的登录日期、用户ID和内容喜好,并按日期升序排序,如果当天出现多个用户同时最早登录,那么这些用户均需要输出。

2. 分析关键问题

  • 找出每天最早的登录时间:从login_tb中提取每一天的最早登录时间。
  • 获取最早登录用户的信息:根据最早登录时间找到对应的用户。
  • 连接用户信息:将最早登录的用户与user_action_tb表连接,以便获取用户的内容喜好。
  • 排序输出:按登录日期升序排序。

3. 解决每个关键问题的代码及讲解

步骤1:找出每天最早的登录时间

我们使用WITH子句创建一个临时表earliest_logins,找出每一天的最早登录时间:

WITH earliest_logins AS (
    SELECT 
        DATE(log_time) AS log_day,
        MIN(log_time) AS earliest_time
    FROM 
        login_tb
    GROUP BY 
        DATE(log_time)
)
  • DATE(log_time) AS log_day:提取登录日期。
  • MIN(log_time) AS earliest_time:找出每一天(同一组)的最早登录时间。
  • GROUP BY DATE(log_time):按日期分组。
步骤2:获取最早登录用户的信息

我们将earliest_loginslogin_tb表连接,获取最早登录用户的信息:

SELECT 
    e.log_day,
    u.user_id,
    u.hobby
FROM 
    earliest_logins e
JOIN 
    login_tb l ON l.log_time = e.earliest_time
  • login_tb l ON l.log_time = e.earliest_time:通过最早登录时间连接,获取最早登录的用户。
步骤3:连接用户信息

我们将最早登录的用户与user_action_tb表连接,以便获取用户的内容喜好:

JOIN
    user_action_tb u ON u.user_id = l.user_id
  • JOIN user_action_tb u ON u.user_id = l.user_id:通过用户ID连接,获取用户的内容喜好。
步骤4:排序输出

我们使用ORDER BY按登录日期升序排序输出结果:

ORDER BY 
    e.log_day;

完整代码

WITH earliest_logins AS (
    SELECT 
        DATE(log_time) AS log_day,
        MIN(log_time) AS earliest_time
    FROM 
        login_tb
    GROUP BY 
        DATE(log_time)
)

SELECT 
    e.log_day,
    u.user_id,
    u.hobby
FROM 
    earliest_logins e
JOIN 
    login_tb l ON l.log_time = e.earliest_time
JOIN
    user_action_tb u ON u.user_id = l.user_id
ORDER BY 
    e.log_day;