如何开始这个 SQL 查询作业?
How to make a start on this SQL query homework?
一家初创公司目前正在开发一款电影流媒体应用。一部电影可以属于一种或多种类型。以下是电影和流派的 table 定义:
TABLE genres
id INTEGER PRIMARY KEY
name VARCHAR(50) NOT NULL
TABLE movies
id INTEGER PRIMARY KEY
name VARCHAR(50) NOT NULL
TABLE moviesGenres
movieId INTEGER REFERENCES moviesid
genreId INTEGER REFERENCES genresid
PRIMARY KEY(movieId, genreId)
一个特定的搜索参数需要属于两种以上流派的所有电影,并且 none 流派是 'Comedy'。
为上述条件写一个查询 returns:
电影的名字。
电影所属的流派数量。
考虑所有场景编写查询:
我写了这个查询,但我无法满足一个测试用例:
select m.name, count(mg.genreId)
from movies m
join
moviesgenres mg
on m.id=mg.movieId
where mg.genreId not in (select id from genres where name='Comedy')
group by m.id,m.name
HAVING count(mg.genreId)>2
下面提到的是我缺少的测试用例:
Some movies have more genres, some movies are Comedy: Wrong answer
您可以使用聚合和 having
子句:
select m.name
from movies m
inner join moviesgenres mg on mg.movieid = m.id
inner join genres g on g.id = mg.genreid
group by m.id, m.name
having count(*) > 2 and max(case when g.name = 'Comedy' then 1 else 0 end) = 0
我们的想法是不要在 where
子句中过滤掉喜剧:这太早了,并且会阻止您确保电影不属于该特定类型。相反,您可以带上所有类型,并使用 having
子句来确保 none 是喜剧。
此解决方案使用子查询和变量(在 sql 服务器中测试):
Declare @comedyGenreID int;
Select @comedyGenreID = id from genres where name='Comedy'
Select name, genres
From (select m.name, count(g.id) as genres
from movies m
inner join moviesgenres mg on mg.movieid = m.id
inner join genres g on g.id = mg.genreid
where mg.genreid <> @comedyGenreID
groupby m.name) as sq
Where genres > 2
我想您可以决定不使用该变量并直接在子查询中使用 'Comedy' 字符串,如下所示:
where g.name <> 'Comedy'
一家初创公司目前正在开发一款电影流媒体应用。一部电影可以属于一种或多种类型。以下是电影和流派的 table 定义:
TABLE genres
id INTEGER PRIMARY KEY
name VARCHAR(50) NOT NULL
TABLE movies
id INTEGER PRIMARY KEY
name VARCHAR(50) NOT NULL
TABLE moviesGenres
movieId INTEGER REFERENCES moviesid
genreId INTEGER REFERENCES genresid
PRIMARY KEY(movieId, genreId)
一个特定的搜索参数需要属于两种以上流派的所有电影,并且 none 流派是 'Comedy'。
为上述条件写一个查询 returns:
电影的名字。 电影所属的流派数量。
考虑所有场景编写查询: 我写了这个查询,但我无法满足一个测试用例:
select m.name, count(mg.genreId)
from movies m
join
moviesgenres mg
on m.id=mg.movieId
where mg.genreId not in (select id from genres where name='Comedy')
group by m.id,m.name
HAVING count(mg.genreId)>2
下面提到的是我缺少的测试用例:
Some movies have more genres, some movies are Comedy: Wrong answer
您可以使用聚合和 having
子句:
select m.name
from movies m
inner join moviesgenres mg on mg.movieid = m.id
inner join genres g on g.id = mg.genreid
group by m.id, m.name
having count(*) > 2 and max(case when g.name = 'Comedy' then 1 else 0 end) = 0
我们的想法是不要在 where
子句中过滤掉喜剧:这太早了,并且会阻止您确保电影不属于该特定类型。相反,您可以带上所有类型,并使用 having
子句来确保 none 是喜剧。
此解决方案使用子查询和变量(在 sql 服务器中测试):
Declare @comedyGenreID int;
Select @comedyGenreID = id from genres where name='Comedy'
Select name, genres
From (select m.name, count(g.id) as genres
from movies m
inner join moviesgenres mg on mg.movieid = m.id
inner join genres g on g.id = mg.genreid
where mg.genreid <> @comedyGenreID
groupby m.name) as sq
Where genres > 2
我想您可以决定不使用该变量并直接在子查询中使用 'Comedy' 字符串,如下所示:
where g.name <> 'Comedy'