2

这是为了我的学习,所以我希望你们能给出与答案相反的提示,不过我也不介意。:)

以下链接是我在 SQLFiddle 中的数据:http ://sqlfiddle.com/#!2/d7373

CREATE TABLE Movies
    (`MovieID` int, `Title` varchar(6), `YearReleased` int)
;

INSERT INTO Movies
    (`MovieID`, `Title`, `YearReleased`)
VALUES
    (1002, 'movie1', 2001),
    (1003, 'movie2', 1951),
    (1004, 'movie3', 2001),
    (1005, 'movie4', 2004),
    (1006, 'movie2', 2007),
    (1007, 'movie5', 2005),
    (1008, 'movie2', 2010),
    (1009, 'movie3', 2006),
    (1010, 'movie6', 2003),
    (1011, 'movie7', 2002),
    (1012, 'movie8', 2004),
    (1013, 'movie9', 2002)
;

我想要做的是输出不止一次发行的电影的名称和发行年份。所以如果你看一下 SQL Fiddle 'movie3' 已经发布了两次,所以我想输出它的名字和它发布的两年。如果一部电影已发行 3 次,则需要放映 3 次,因为有 3 对发行日期。以下是我希望如何输出 SQL Fiddle 中的数据的示例。

Movie   | FirstRelease | SecondReleased
---------------------------------------
movie2  |    1951      |      2007
movie2  |    1951      |      2010
movie2  |    2007      |      2010
movie3  |    2001      |      2007

多谢你们。

4

2 回答 2

1

如果你想要所有的发布日期对,你可以做一个简单的自加入(小提琴):

SELECT m1.Title AS Movie, m1.YearReleased AS FirstRelease,
    m2.YearReleased AS SecondReleased
FROM Movies m1
INNER JOIN Movies m2 ON m2.Title = m1.Title 
    AND m2.YearReleased > m1.YearReleased        

这会将电影中的行与具有相同标题和更大发行年份的行相关联,从而为您提供所有对。


如果您只需要根据编辑前的问题发布日期和下一个MIN后续发布年份,则可以使用(小提琴)进行自加入:

SELECT m1.Title AS Movie, m1.YearReleased AS FirstRelease,
    MIN(m2.YearReleased) AS SecondReleased
FROM Movies m1
INNER JOIN Movies m2 ON m2.Title = m1.Title 
    AND m2.YearReleased > m1.YearReleased        
GROUP BY m1.Title, m1.YearReleased

这样做是针对每部电影和每个发行年份,它会获得MIN同一部电影的最大(下一个)发行年份。INNER JOIN确保它只返回有下一个版本的行。

请注意,这遵循您问题中的请求,因为它将为每部电影返回多行,其中有许多版本(例如movie2),其中列名“FirstRelease”和“SecondReleased”有点用词不当。

很抱歉直接给出答案,但我认为这个查询说了一千个字。

于 2013-08-15T03:30:49.033 回答
1

这里有一个提示:

分组方式:http ://www.w3schools.com/sql/sql_groupby.asp

拥有:http ://www.w3schools.com/sql/sql_having.asp

它们结合使用

答案(剧透?):

http://sqlfiddle.com/#!2/d7373/4/0

于 2013-08-15T03:27:17.757 回答