以前的部分?自我加入?

时间:2015-01-07 09:33:44

标签: mysql sql ms-access join self

我有一部有很多电影的filmdatabase。电影可以有前一部分(或下一部分)。我想运行一个查询,显示包含所有以前的电影和所有下一部电影的列表。 该表包含以下列: movie_id | title | previous_part(这是上一部分的电影ID)| publication_year

这就是我现在所拥有的,但它不会起作用

SELECT TOP 1 e1.movie_id, e1.title, e1.previous_part
FROM dbo_Movie AS e1 INNER JOIN dbo_Movie AS e2 ON e1.movie_id = e2.previous_part
ORDER BY e1.publication_year;

e1.movie_id是电影中随机部分的参数。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您能否澄清以下内容:

1)很多电影有1000 / 100,000 / 10,000,000(例如个人收藏,小型应用,全球图书馆) 2)您正在查看多少部分以及您希望如何呈现数据?

逻辑上明智的是,如果有一个合理数量的有限部分(小于10)你可以制作一些笨拙的sql构造来列出所有以前的部分和未来的部分。然而,如果你只是在它之前存在,如果它存在,那么如果它存在则你可以尝试:

解决方案1 ​​:(列出所有电影部分以及上一部分和下一部分(如果存在)

select e1.movie_id, e1.title, pp.movie_id as prev_movie_id,  np.movie_id as next_movie_id
from dbo_Movie AS e1
left join dbo_Movie AS pp
    ON e1.previous_part = pp.movie_id
left join dbo_Movie AS np
    ON np.previous_part = e1.movie_id

预期产出:

movie_id | title | prev_movie_id | next_movie_id
m1p2      | zed   | m1p1          | m1p3
m1p3      | zed   | m1p2          | null
m1p1      | zed   | null          | m1p2
m2p1      | phi   | null          | null
m3p1      | quo   | null          | m3p2
m3p2      | quo   | m3p1          | null

解决方案2.1:列出所有电影部分和之前的下一部分

select e1.movie_id, e1.title, np.movie_id as next_movie_id
from dbo_Movie AS e1
inner join dbo_Movie AS np  
    ON np.previous_part = e1.movie_id
--inner join means anything rows where this isn't true will be removed

预期产出:

movie_id | title | next_movie_id
m1p2      | zed   | m1p3
m1p1      | zed   | m1p2
m3p1      | quo   | m3p2

解决方案2.2:列出所有电影部分以及之前的下一部分

select e1.movie_id, e1.title, pp.movie_id as prev_movie_id
from dbo_Movie AS e1
inner join dbo_Movie AS pp  
    ON e1.previous_part = pp.movie_id

预期产出:

movie_id | title | prev_movie_id 
m1p2      | zed   | m1p1         
m1p3      | zed   | m1p2            
m3p2      | quo   | m3p1        

注意:

1)对于prev_movie_id和next_movie_id都无法正常处理空值。

2)在SQL:1999中显然没有用于限制结果的ANSI sql标准,但是bobince在回复:[{3}}

中提到了后来的标准。