• Leetcode力扣 MySQL数据库 1919 兴趣相同的朋友


    1919 兴趣相同的朋友

    SQL架构

    1. Create table If Not Exists Listens_1919 (user_id int, song_id int, day date);
    2. Create table If Not Exists Friendship_1919 (user1_id int, user2_id int);
    3. Truncate table Listens_1919;
    4. insert into Listens_1919 (user_id, song_id, day) values ('1', '10', '2021-03-15');
    5. insert into Listens_1919 (user_id, song_id, day) values ('1', '11', '2021-03-15');
    6. insert into Listens_1919 (user_id, song_id, day) values ('1', '12', '2021-03-15');
    7. insert into Listens_1919 (user_id, song_id, day) values ('2', '10', '2021-03-15');
    8. insert into Listens_1919 (user_id, song_id, day) values ('2', '11', '2021-03-15');
    9. insert into Listens_1919 (user_id, song_id, day) values ('2', '12', '2021-03-15');
    10. insert into Listens_1919 (user_id, song_id, day) values ('3', '10', '2021-03-15');
    11. insert into Listens_1919 (user_id, song_id, day) values ('3', '11', '2021-03-15');
    12. insert into Listens_1919 (user_id, song_id, day) values ('3', '12', '2021-03-15');
    13. insert into Listens_1919 (user_id, song_id, day) values ('4', '10', '2021-03-15');
    14. insert into Listens_1919 (user_id, song_id, day) values ('4', '11', '2021-03-15');
    15. insert into Listens_1919 (user_id, song_id, day) values ('4', '13', '2021-03-15');
    16. insert into Listens_1919 (user_id, song_id, day) values ('5', '10', '2021-03-16');
    17. insert into Listens_1919 (user_id, song_id, day) values ('5', '11', '2021-03-16');
    18. insert into Listens_1919 (user_id, song_id, day) values ('5', '12', '2021-03-16');
    19. Truncate table Friendship_1919;
    20. insert into Friendship_1919 (user1_id, user2_id) values ('1', '2');
    21. insert into Friendship_1919 (user1_id, user2_id) values ('2', '4');
    22. insert into Friendship_1919 (user1_id, user2_id) values ('2', '5');


    Table: Listens

    +-------------+---------+
    | Column Name | Type    |
    +-------------+---------+
    | user_id     | int     |
    | song_id     | int     |
    | day         | date    |
    +-------------+---------+
    该表没有主键,因此会存在重复的行。
    该表的每一行所代表的含义是:用户(user_id)在某天(day)听了某首歌曲(song_id)。
     

    Table: Friendship

    +---------------+---------+
    | Column Name   | Type    |
    +---------------+---------+
    | user1_id      | int     |
    | user2_id      | int     |
    +---------------+---------+
    (user1_id, user2_id) 是该表的主键。
    该表的每一行所代表的含义是,用户(user1_id, user2_id)是朋友。
    注意:user1_id < user2_id。
     

    请写一段SQL查询获取到兴趣相同的朋友。用户 x 和 用户 y 是兴趣相同的朋友,需满足下述条件:

    用户 x 和 y 是朋友,并且
    用户 x and y 在同一天内听过相同的歌曲,且数量大于等于三首.
    结果表无需排序。注意:返回的结果需要和源数据表的呈现方式相同 (例如, 需满足 user1_id < user2_id)。

    结果表的格式如下例:


    Listens table:
    +---------+---------+------------+
    | user_id | song_id | day        |
    +---------+---------+------------+
    | 1       | 10      | 2021-03-15 |
    | 1       | 11      | 2021-03-15 |
    | 1       | 12      | 2021-03-15 |
    | 2       | 10      | 2021-03-15 |
    | 2       | 11      | 2021-03-15 |
    | 2       | 12      | 2021-03-15 |
    | 3       | 10      | 2021-03-15 |
    | 3       | 11      | 2021-03-15 |
    | 3       | 12      | 2021-03-15 |
    | 4       | 10      | 2021-03-15 |
    | 4       | 11      | 2021-03-15 |
    | 4       | 13      | 2021-03-15 |
    | 5       | 10      | 2021-03-16 |
    | 5       | 11      | 2021-03-16 |
    | 5       | 12      | 2021-03-16 |
    +---------+---------+------------+

    Friendship table:
    +----------+----------+
    | user1_id | user2_id |
    +----------+----------+
    | 1        | 2        |
    | 2        | 4        |
    | 2        | 5        |
    +----------+----------+

    Result table:
    +----------+----------+
    | user1_id | user2_id |
    +----------+----------+
    | 1        | 2        |
    +----------+----------+

    用户 1 和 2 是朋友, 并且他们在同一天内都听了10、11、12的歌曲。所以,他们是兴趣相同的朋友。
    用户 1 和 3 在同一天内都听了10、11、12的歌曲,但他们不是朋友。
    用户 2 和 4 是朋友,但他们同一天内听过相同的歌曲的数量小于3。
    用户 2 和 5 是朋友,并且在都听了了10、11、12的歌曲,但不在同一天内。

    解题

    1. select distinct t.user1_id
    2.        ,t.user2_id
    3.   from 
    4. (select a.user_id as user1_id
    5.        ,b.user_id as user2_id
    6.        ,a.song_id
    7.        ,a.day 
    8.        ,count(1) over (partition by a.user_id,b.user_id,a.day) as cnt 
    9.   from (select distinct user_id,song_id,day from Listens_1919) a 
    10.  inner join (select distinct user_id,song_id,day from Listens_1919) b 
    11.     on a.user_id <> b.user_id 
    12.    and a.song_id = b.song_id 
    13.    and a.day = b.day) t  
    14.  inner join Friendship_1919 t1 
    15.     on t.user1_id = t1.user1_id and t.user2_id = t1.user2_id
    16.  where t.cnt >= 3;

  • 相关阅读:
    【二】【SQL】去重表数据及分组聚合查询
    实习日常的点点滴滴记录(Java基础知识之Java锁)------好记性不如烂笔头--慢慢积累,厚积薄发
    基于Springboot的校园健康系统-计算机毕业设计源码
    【算法】算法题总结
    jenkins CSV编码导致乱码问题解决
    数据库服务Amozon DynamoDB(入门分享)
    拼图游戏-第13届蓝桥杯Scratch选拔赛真题精选
    【业务功能篇94】微服务-springcloud-springboot-认证服务-注册功能-第三方短信验证API
    Switchquery:移动端秒级配置触达平台
    [附源码]计算机毕业设计springboot考试系统
  • 原文地址:https://blog.csdn.net/m0_46458212/article/details/127957632