Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从最高级到最低级排序的列表;创作了最多家庭电影的创作者将名列榜首_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 从最高级到最低级排序的列表;创作了最多家庭电影的创作者将名列榜首

Sql 从最高级到最低级排序的列表;创作了最多家庭电影的创作者将名列榜首,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个SQL作业问题,因此我不知道如何编写查询。基本上,这就是问题所在: 一家研究机构要求提供所有电影系列创作者的姓名,以及他们创作的“家庭电影”的数量,即使他们没有创作。该机构希望该名单从大到小排序;创作最多家庭电影的创作者将排在榜首,创作最少家庭电影的创作者将排在最后。编写一个提供此信息的查询,其中包含有用的列 以下是设置表和数据的脚本: Create Table Genre ( Genre_id decimal(12) NOT NULL Primary Key , Gen

我有一个SQL作业问题,因此我不知道如何编写查询。基本上,这就是问题所在:

一家研究机构要求提供所有电影系列创作者的姓名,以及他们创作的“家庭电影”的数量,即使他们没有创作。该机构希望该名单从大到小排序;创作最多家庭电影的创作者将排在榜首,创作最少家庭电影的创作者将排在最后。编写一个提供此信息的查询,其中包含有用的列

以下是设置表和数据的脚本:

Create Table Genre
(
    Genre_id decimal(12) NOT NULL Primary Key
    , Genre_name varchar(64) NOT NULL
)

Create Table Creator
(
    Creator_id decimal(12) not null Primary Key
    , first_name varchar(64) NOT NULL
    , last_name varchar(64) NOT NULL
)

Create Table Movie_series
(
    movie_series_id decimal(12)  not null Primary Key
    , genre_id decimal(12) NOT NULL Foreign key references Genre(genre_id)
    , creator_id decimal(12) NOT NULL Foreign key references Creator(Creator_id)
    , series_name varchar(255) NOT NULL
    , suggested_price decimal(8,2) NULL
)

Create Table Movie
(
    Movie_id decimal(12) not null Primary Key
    , movie_series_id decimal(12) NOT NULL Foreign key references Movie_series(movie_series_id)
    , movie_name varchar(64) NOT NULL
    , length_in_minutes decimal(4)
)
这是分别将数据插入表的脚本

--Inserting data to Genre Table
Insert into Genre (Genre_id, Genre_name)
values
(1, 'Fantasy'),
(2, 'Family Film'),
(3, 'Action spy')

--Inserting data to Creator Table
Insert into Creator (Creator_id, first_name, last_name)
values
(1, 'George', 'Lucas'),
(2, 'John', 'Lasseter'),
(3, 'John', 'Tolkien'),
(4, 'Bruce', 'Gellar')

--Inserting data to Movie_series Table
Insert into Movie_series (movie_series_id, genre_id, creator_id,  series_name, suggested_price)
values
(1, 1, 1, 'Star Wars', 129.99),
(2, 2, 2, 'Toy Story', 22.13),
(3, 1, 3, 'Lord of the Rings', NULL),
(4, 3, 4, 'Mission Impossible', 50.00)

--Inserting data to Movie Table
Insert into Movie (Movie_id, movie_series_id, movie_name,  length_in_minutes)
values
(1, 1, 'Episode I: The Phantom Menace', 136),
(2, 1, 'Episode II: Attack of the Clones', 142),
(3, 1, 'Episode III: Revenge of the Sith', 140),
(4, 1, 'Episode IV: A New Hope', 121),
(5, 2, 'Toy Story', 121),
(6, 2, 'Toy Story 2', 135),
(7, 2, 'Toy Story 3', 148),
(8, 3, 'The Lord of the Rings: The Fellowship of the Ring', 228),
(9, 3, 'The Lord of the Rings: The Two Towers', 235),
(10, 3, 'The Lord of the Rings: The Return of the King', 200),

(11, 4, 'Mission: Impossible', 110),
(12, 4, 'Mission: Impossible 2', 123),
(13, 4, 'Mission: Impossible III', 126),
(14, 4, 'Mission: Impossible - Ghost Protocol', 133),
(15, 4, 'Mission: Impossible - Rogue Nation', 131),
(16, 4, 'Mission: Impossible - Fallout', 147)
我应该看到的输出是:

Creator - [Number of "Family Film" movies]
John Lasseter - 3
George Lucas - 0
John Tolkien - 0
Bruce Gellar - 0
但是,我不确定如何使用连接将数据和计数连接在一起。这是我尝试的查询:

select count(ms.genre_id), g.Genre_name, c.first_name + ' ' + c.last_name as [Creator]
from Movie m
inner join Movie_series ms on ms.movie_series_id = m.movie_series_id
inner join Creator c on ms.creator_id = c.Creator_id
left join Genre g on ms.genre_id = g.Genre_id and g.Genre_name = 'Family Film'
group by ms.genre_id, c.first_name, c.last_name, g.Genre_name

任何帮助都将不胜感激。提前感谢。

您想要外部联接,而不是内部联接。从创作者开始,然后加入电影系列、电影和流派。通过使用左连接,您可以确保所有创建者都在结果中-左连接保留左关系中的所有行

你只想按创作者分组,而不是按流派分组。但是,请确保在GROUPBY子句中包含creator_id,因为只有使用名称列才能合并两个实际上不同的、仅共享一个名称的创建者

只需使用ORDERBY子句按计数对结果进行排序

SELECT c.first_name,
       c.last_name,
       count(g.genre_id)
       FROM creator c
            LEFT JOIN movie_series ms
                      ON ms.creator_id = c.creator_id
            LEFT JOIN movie m
                      ON m.movie_series_id = ms.movie_series_id
            LEFT JOIN genre g
                      ON g.genre_id = ms.genre_id
                         AND g.genre_name = 'Family Film'
       GROUP BY c.creator_id,
                c.first_name,
                c.last_name
       ORDER BY count(g.genre_id) DESC;

您需要从Creator开始,将其作为您始终拥有的驾驶行,并将电影连接嵌套在电影系列的左连接中

因为您总是想要该类型名称,所以需要首先有效地交叉连接该行,然后向电影系列连接添加进一步的连接条件

选择countms.genre\u id、g.genre\u name、c.first\u name+“”+c.last\u name作为[创建者] 从…起 创造者c 内部连接类型g对g。类型名称=‘家庭电影’ 左加入电影系列 ms.Movie\u series\u id=m.Movie\u series\u id上的内部连接电影m 在ms.creator\u id=c.creator\u id和ms.genre\u id=g.genre\u id上 按c.创建者id、c.姓氏、g.流派名称分组 按countms.genre_id desc排序;
我看到您正在无条件地对movie_系列表执行左联接。这意味着什么?我还没有学会嵌套joinsIt确实有一个条件,两行之后。但关键是要在概念上将Movie-to-Movie_系列内部连接起来,然后将其结果左连接回查询的其余部分