订阅更新

6 月播放过的儿童适宜电影

SQL 实战 123 题 · 第 116 题 简单 约 2 分钟读完

LeetCode 1495 · 多条件过滤、去重

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

节目 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 更能表达意图。
刷题进度保存在当前浏览器