6 月播放过的儿童适宜电影
LeetCode 1495 · 多条件过滤、去重
面试怎么回答
节目 JOIN 内容,WHERE 播放日期在 2020-06-01 到 2020-06-30 之间、Kids_content = 'Y'、content_type = 'Movies',SELECT DISTINCT title。右表有过滤条件时 LEFT JOIN 实际上等价于 INNER JOIN,我会直接写 INNER JOIN。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
节目表记录每天播放了哪些内容,内容表记录标题、是否儿童适宜、内容类型。找出 2020 年 6 月播放过的、儿童适宜的电影标题,去重输出。
表结构
- TVProgram:program_date、content_id、channel;(program_date, content_id) 为主键
- Content:content_id(主键)、title、Kids_content(Y / N)、content_type
思路
关联两表后三个条件同时过滤:6 月播放、儿童适宜、类型是电影;同一部电影可能播放多次,标题要去重。
参考解法
select distinct title
from TVProgram t left join Content c
on t.content_id = c.content_id
where Kids_content ='Y'
and date_format(program_date ,'%Y-%m')='2020-06'
and content_type='Movies'
易错点
- 日期条件写成区间(6 月 1 日到 6 月 30 日)比对列做 DATE_FORMAT 更利于索引。
- 内容表上有过滤条件时,用 LEFT JOIN 和 INNER JOIN 效果一样,写 INNER JOIN 更能表达意图。