从一个表SQL输出多个列?

时间:2013-08-15 03:21:30

标签: sql sqlfire

这是我的学习,所以如果你们能给出反对答案的提示,我更愿意,但我不介意。 :)

以下链接是我在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对发布日期。以下是我希望如何输出SQL Fiddle中的数据的示例。

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

谢谢大家。

2 个答案:

答案 0 :(得分:1)

这是一个提示:

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

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

它们一起使用

答案(扰流板?):

  

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

答案 1 :(得分:1)

如果您想要所有发布日期对,您可以进行简单的自我加入(fiddle):

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进行自我加入({{3} }):

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 imum(下一个)发行年份。 INNER JOIN确保它只返回有下一个版本的行。

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

直截了当地回答道歉,但我认为这个问题说了千言万语。