目錄
- 1 題目
- 2 建表語句
- 3 題解
題目來源:騰訊。
1 題目
現有三張表分別為:
用戶關注表 t_follow(user_id,follower_id)
記錄用戶ID及其關注的人ID,請給用戶1 推薦他關注的用戶喜歡的音樂名稱
+----------+--------------+
| user_id | follower_id |
+----------+--------------+
| 1 | 2 |
| 1 | 4 |
| 1 | 5 |
+----------+--------------+
用戶喜歡的音樂t_music_likes(user_id,music_id)
+----------+-----------+
| user_id | music_id |
+----------+-----------+
| 1 | 10 |
| 2 | 20 |
| 2 | 30 |
| 3 | 20 |
| 3 | 30 |
| 4 | 40 |
| 4 | 50 |
+----------+-----------+
音樂名字表t_music(music_id,music_name)
+-----------+-------------+
| music_id | music_name |
+-----------+-------------+
| 10 | a |
| 20 | b |
| 30 | c |
| 40 | d |
| 50 | e |
+-----------+-------------+
2 建表語句
--建表語句
CREATE TABLE t_follow (
user_id bigint COMMENT '用戶ID',
follower_id bigint COMMENT '關注用戶ID'
) COMMENT '用戶關注表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
;
-- 插入數據
insert into t_follow(user_id,follower_id)
values
(1,2),
(1,4),
(1,5)
;
-- 建表語句
CREATE TABLE t_music_likes (
user_id bigint COMMENT '用戶ID',
music_id bigint COMMENT '音樂ID'
) COMMENT '用戶喜歡音樂ID'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
;
--插入語句
insert into t_music_likes(user_id,music_id)
values
(1,10),
(2,20),
(2,30),
(3,20),
(3,30),
(4,40),
(4,50)
;
--建表語句
CREATE TABLE t_music (
music_id bigint COMMENT '音樂ID',
music_name string COMMENT '音樂名稱'
) COMMENT '音樂名字表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
;
-- 插入語句
insert into t_music(music_id,music_name)
values
(10,'a'),
(20,'b'),
(30,'c'),
(40,'d'),
(50,'e')
;
3 題解
步驟一:根據用戶關注表和用戶喜歡的音樂表進行關聯,查詢出每個用戶關注用戶喜歡的音樂ID,再篩選出用戶1關注用戶喜歡的音樂ID;
selectt1.user_id,t1.follower_id,music_id
fromt_follow t1
inner joint_music_likes t2
on t1.follower_id=t2.user_id
where t1.user_id=1;
執行結果
步驟二:關聯音樂名字表,關聯出對應的音樂名稱;
selectt1.user_id,t1.follower_id,t2.music_id,music_name
fromt_follow t1
inner joint_music_likes t2
on t1.follower_id=t2.user_id
inner joint_music t3
on t2.music_id=t3.music_id
where t1.user_id=1;
執行結果
步驟三:行轉列并對重復的音樂名稱去重,得到最終結果。
selectt.user_id,concat_ws(",",collect_set(music_name)) push_music
from(selectt1.user_id,t1.follower_id,t2.music_id,music_namefromt_follow t1inner joint_music_likes t2on t1.follower_id=t2.user_idinner joint_music t3on t2.music_id=t3.music_idwhere t1.user_id=1)t
group by t.user_id;
執行結果