首页 > 试题广场 >

使用join查询方式找出没有分类的电影id以及名称

[编程题]使用join查询方式找出没有分类的电影id以及名称
  • 热度指数:167769 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
现有电影信息表film,包含以下字段:
字段 说明
film_id 电影id
title 电影名称
description 电影描述信息

有类别表category,包含以下字段:
字段 说明
category_id 电影分类id
name 电影分类名称
last_update 电影分类最后更新时间

电影分类表film_category,包含以下字段:
字段 说明
film_id 电影id
category_id 电影分类id
last_update 电影id和分类id对应关系的最后更新时间

使用join查询方式找出没有分类的电影id以及其电影名称。
示例1

输入

drop table if exists  film ;
drop table if exists  category  ; 
drop table if exists  film_category  ; 
CREATE TABLE IF NOT EXISTS film (
  film_id smallint(5)  NOT NULL DEFAULT '0',
  title varchar(255) NOT NULL,
  description text,
  PRIMARY KEY (film_id));
CREATE TABLE category  (
   category_id  tinyint(3)  NOT NULL ,
   name  varchar(25) NOT NULL, `last_update` timestamp,
  PRIMARY KEY ( category_id ));
CREATE TABLE film_category  (
   film_id  smallint(5)  NOT NULL,
   category_id  tinyint(3)  NOT NULL, `last_update` timestamp);
INSERT INTO film VALUES(1,'ACADEMY DINOSAUR','A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies');
INSERT INTO film VALUES(2,'ACE GOLDFINGER','A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China');
INSERT INTO film VALUES(3,'ADAPTATION HOLES','A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory');

INSERT INTO category VALUES(1,'Action','2006-02-14 20:46:27');
INSERT INTO category VALUES(2,'Animation','2006-02-14 20:46:27');
INSERT INTO category VALUES(3,'Children','2006-02-14 20:46:27');
INSERT INTO category VALUES(4,'Classics','2006-02-14 20:46:27');
INSERT INTO category VALUES(5,'Comedy','2006-02-14 20:46:27');
INSERT INTO category VALUES(6,'Documentary','2006-02-14 20:46:27');
INSERT INTO category VALUES(7,'Drama','2006-02-14 20:46:27');
INSERT INTO category VALUES(8,'Family','2006-02-14 20:46:27');
INSERT INTO category VALUES(9,'Foreign','2006-02-14 20:46:27');
INSERT INTO category VALUES(10,'Games','2006-02-14 20:46:27');
INSERT INTO category VALUES(11,'Horror','2006-02-14 20:46:27');

INSERT INTO film_category VALUES(1,6,'2006-02-14 21:07:09');
INSERT INTO film_category VALUES(2,11,'2006-02-14 21:07:09');

输出

3|ADAPTATION HOLES
SELECT f.film_id, title
from film f 
left join film_category fc on f.film_id = fc.film_id
left join category c on fc.category_id = c.category_id
where fc.category_id is null


SELECT f.film_id, title
from film f 
left join film_category fc on f.film_id = fc.film_id
left join category c on fc.category_id = c.category_id
where c.name is null

发表于 2021-12-21 09:41:58 回复(0)
发表于 2020-05-24 23:45:33 回复(0)

解题思路是运用 LEFT JOIN 连接两表,用 IS NULL 语句限定条件

1、用 LEFT JOIN 连接 film 和 film_category,限定条件为 f.film_id = fc.film_id,即连接电影 id 和电影分类 id,如果电影没有分类,则电影分类 id 显示 null

2、再用 WHERE 来限定条件 fc.category_id IS NULL 选出没分类的电影

/* 注意:最后一句若写成 ON f.film_id = fc.film_id AND fc.category_id IS NULL,则意义变成左连接两表 film_id 相同的记录,且 film_category 原表中的 fc.category 的值为 null。显然,原表中的 fc.category 的值恒不为 null,因此(f.film_id = fc.film_id AND fc.category_id IS NULL)恒为 FALSE,左连接后则只会显示 film 表的数据,而 film_category 表的数据全显示为 null */

SELECT f.film_id, f.title FROM film f LEFT JOIN film_category fc
ON f.film_id = fc.film_id WHERE fc.category_id IS NULL
编辑于 2018-03-16 18:35:35 回复(37)
select f.film_id,f.title from (film f
left join film_category fc on fc.film_id=f.film_id) as cc
where cc.category_id is null

看了前面几位同学写的,发现如果是类似这样:
where f.film_id not in (select film_id from film_category);
那么连接的作用也就不存在了
发表于 2017-08-30 16:49:54 回复(3)
select f.film_id,f.title
from film as f left join film_category as fm
on f.film_id = fm.film_id
where f.film_id not in (select film_id from film_category);

发表于 2017-08-27 16:07:58 回复(0)
解题思路是运用 LEFT JOIN 连接两表,用 IS NULL 语句限定条件
1、用 LEFT JOIN 连接 film 和 film_category,限定条件为 f.film_id = fc.film_id,即连接电影id和电影分类id,如果电影没有分类,则电影分类id显示null
2、再用 WHERE 来限定条件 fc.category_id IS NULL 选出没分类的电影
/** 注意:最后一句若写成 ON f.film_id = fc.film_id AND fc.category_id IS NULL,则意义变成左连接两表 film_id 相同的记录,且 fc.category 的值为 null,由于 fc.category的值不为null,即(f.film_id = fc.film_id AND fc.category_id IS NULL)恒为FALSE,所以左连接后只显示film表的数据,而 film_category 表的数据全为 null**/
发表于 2017-08-15 16:48:25 回复(0)
select 
f.film_id,
f.title
from
film f
left join
film_category fc
on
f.film_id=fc.film_id
where fc.category_id is null

通过film表左外连接film_category表,没有电影分类的分类字段会为null,通过分类is null 
找到满足条件的数据 
发表于 2020-02-15 14:53:53 回复(0)
select film_id, title from film
where film_id not in (select film_id from film_category)
发表于 2019-04-18 19:32:30 回复(2)
select bb.film_id,bb.title
from (film left join film_category on film.film_id = film_category.film_id) as bb
where bb.category_id is null
1.先用left join 连接film和film_category表。如果一个film没有对应的category,category_id就是null
2.用where 限定 category_id 为null
发表于 2017-08-30 14:19:06 回复(0)
select film_id as '电影id',title as '电影名称'
from film       #3.再从film这张表选出film_id不在的就是 没有分类的
where film_id not in(
                    select fc.film_id      #2.所以这只要选出已经分类的电影id
                    from film_category fc
                    join category c using(category_id)       #1:这两张表连接得到的是已经分类的电影id,分类名称,分类id
)    
# 注意:!!!using语句就等同于on,但是只有两表字段名完全相同时才能使用喔
发表于 2022-05-20 17:25:47 回复(0)
SELECT 
    f.film_id,
    f.title
FROM
    film f
    LEFT JOIN film_category fc ON f.film_id = fc.film_id
    LEFT JOIN category c ON fc.category_id = c.category_id
WHERE
    c.category_id IS NULL

发表于 2021-10-18 22:52:38 回复(0)
SELECT film.film_id,film.title
FROM film
LEFT JOIN film_category
on film.film_id = film_category.film_id
where film_category.category_id is null;

#找出没有匹配分类的电影,使用左/右外连接都可以
#这道题目需要注意的是on语句后面不可以再用and来筛选没有分类的电影

发表于 2021-08-15 00:21:26 回复(0)
select f.film_id
,title
from film f
left join film_category c
on f.film_id = c.film_id
where category_id IS NULL

编辑于 2021-07-20 19:35:08 回复(2)
select f.film_id,f.title from film f 
left join film_category fc on f.film_id=fc.film_id
where fc.category_id is null

发表于 2021-06-28 15:00:29 回复(0)
【整体思路】
由于film表的电影ID是齐全的,而film_category表中不包含没有分类的电影ID,所以要用film表left join连接film_category表。
【重点】
如何找出某个字段中为null的记录:不是用=‘null’,而是用 is null
【具体代码】
select f1.film_id
        ,f1.title
from film f1
left join film_category f2 on f1.film_id=f2.film_id
where f2.category_id is null;
发表于 2021-01-24 00:05:29 回复(0)
select film_id, title from film where film_id not in 
(select film_id from film_category);

发表于 2020-08-12 21:59:47 回复(1)
select film.film_id, film.title from film 
where film.film_id not in 
(select film_category.film_id from film_category inner join category 
on film_category.category_id = category.category_id);
这道题也可以使用left join来限定没有分配category的电影
发表于 2019-10-13 13:57:56 回复(1)
select f.film_id,f.title
from film f left join film_category fc on f.film_id=fc.film_id
left join category c on c.category_id=fc.category_id
where f.film_id not in (select film_id from film_category)
注意不要遗漏,不要将名字写缺损了
发表于 2024-10-22 11:34:16 回复(0)
select fi.film_id
,fi.title
from film fi left join film_category fc on
fi.film_id=fc.film_id
where fc.category_id is null 

发表于 2024-05-08 23:58:31 回复(0)
select a.film_id,a.title
from film a 
left join film_category b 
on a.film_id = b.film_id 
left join category c 
on b.category_id = c.category_id 
where b.film_id is null 
;

发表于 2022-05-10 16:14:10 回复(0)