回忆是一座桥
却是通往寂寞的牢

SQL案例 - 每天登录最早的用户的内容喜好

描述

某产品在2022年2月6-9日用户登录信息表及用户信息和评分信息交叉表如下,

用户登录信息表login_tb(log_id-登录动作id,user_id-用户id, log_time-登录时间),如下所示:

log_id user_id log_time
101 101 2022-02-06 07:24:00
102 102 2022-02-06 07:24:00
103 103 2022-02-06 09:36:00
104 102 2022-02-07 09:37:00
105 103 2022-02-07 12:01:00
106 101 2022-02-07 12:23:00
107 102 2022-02-08 08:37:00
108 103 2022-02-09 10:43:00
109 101 2022-02-09 14:56:00

用户信息及评分信息交叉表user_action_tb(user_id-用户id,hobby-喜好标签, score-评分),如下所示:

注:该表存储用户id及用户个人喜好内容标签,以及对平台推荐内容的评分信息

user_id hobby score
101 健身 88
102 影视 81
103 美妆 78
104 健身 68
105 体育 90
106 影视 56
107 体育 89
108 影视 77

问题:请查询每天登陆最早的用户的内容喜好?

注:如果当天出现多个用户同时最早登录,那么这些用户均需要输出

输出日期、用户id、用户内容喜好,结果按照日期升序排序

示例输出如下:

log_day user_id hobby
2022-02-06 101 健身
2022-02-06 102 影视
2022-02-07 102 影视
2022-02-08 102 影视
2022-02-09 103 美妆

解释:2022年2月6日用户101和102均在7:24登录,故在当天最早登录的用户是101和102,他们内容喜好标签分别是健身、影视。

其他结果同理

示例1

输入:

drop table if exists  `login_tb` ;   
CREATE TABLE `login_tb` (
`log_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`log_time` datetime NOT NULL,
PRIMARY KEY (`log_id`));
INSERT INTO login_tb VALUES(101,101,'2022-02-06 07:24:00');
INSERT INTO login_tb VALUES(102,102,'2022-02-06 07:24:00');
INSERT INTO login_tb VALUES(103,103,'2022-02-06 09:36:00');
INSERT INTO login_tb VALUES(104,102,'2022-02-07 09:37:00');
INSERT INTO login_tb VALUES(105,103,'2022-02-07 12:01:00');
INSERT INTO login_tb VALUES(106,101,'2022-02-07 12:23:00');
INSERT INTO login_tb VALUES(107,102,'2022-02-08 08:37:00');
INSERT INTO login_tb VALUES(108,103,'2022-02-09 10:43:00');
INSERT INTO login_tb VALUES(109,101,'2022-02-09 14:56:00');

drop table if exists  `user_action_tb` ;   
CREATE TABLE `user_action_tb` (
`user_id` int(11) NOT NULL,
`hobby` varchar(8) NOT NULL,
`score` int(11) NOT NULL,
PRIMARY KEY (`user_id`));
INSERT INTO user_action_tb VALUES(101,'健身',88);
INSERT INTO user_action_tb VALUES(102,'影视',81);
INSERT INTO user_action_tb VALUES(103,'美妆',78);
INSERT INTO user_action_tb VALUES(104,'健身',68);
INSERT INTO user_action_tb VALUES(105,'体育',90);
INSERT INTO user_action_tb VALUES(106,'影视',56);
INSERT INTO user_action_tb VALUES(107,'体育',89);
INSERT INTO user_action_tb VALUES(108,'影视',77);

输出:

log_day|user_id|hobby
2022-02-06|101|健身
2022-02-06|102|影视
2022-02-07|102|影视
2022-02-08|102|影视
2022-02-09|103|美妆

答案

解法1:

select
    l.log_day,
    u.user_id,
    u.hobby
from
    (
        select
            *,
            date (a.log_time) log_day
        from
            login_tb a
        where
            a.log_time = (
                select
                    min(b.log_time)
                from
                    login_tb b
                where
                    date (a.log_time) = date (b.log_time)
            )
    ) l
    left join user_action_tb u on l.user_id = u.user_id
order by
    log_day;

*本案例来自牛客网,但答案为原创,如有雷同纯属巧合*

未经允许不得转载:夕枫 » SQL案例 - 每天登录最早的用户的内容喜好
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论