2015-01-07 28 views
0

我有一個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是電影的一個隨機部分的paramameter。

在此先感謝!

+2

您是否使用MySQL和MS訪問? TOP不是標準的SQL,我建議在編寫可移植的SQL時使用ANSI/ISO標準SQL。 – jarlh

+0

是的,我。我認爲TOP 1可以被刪除。 – Robert

回答

0

你能澄清如下:

1)有多少是很多 2)有多少部分是你在看電影1000/100,000/10,000,000(如個人收藏,小應用,全球圖書館)和您希望如何呈現數據?

邏輯上,如果有合理數量的有限部分(小於10),你可以做一些不太好的sql構造來列出所有以前的部分和未來的部分。如何過,如果你只是在對單以前,如果它存在和未來,如果它存在,你可以嘗試:

解決方案1:(列出所有電影的部分,如果它們存在的prev和next部分)

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結果ANSI SQL標準:1999年,但沒有在後來的標準答覆爲bobince如提及:Is there an ANSI SQL alternative to the MYSQL LIMIT keyword?

+0

非常感謝您的回答。 不幸的是它還沒有工作。 我在我的數據庫中有大約400.000部電影。 我在Access中有一個按鈕。它打開這個查詢,它有一個帶有movie_id的參數。 例如:當我按下快速和激烈的按鈕時,我選擇看到快速和憤怒的部分4. 然後,我想要一個列表只顯示快速和憤怒的部分。所以: - 快速和憤怒1 - 快速和激烈2 - - - 快速和激烈6 – Robert

+0

好吧,那麼你的用例一次只能查詢一個電影嗎?另外你可以提供表格的DDL嗎?最後,我認爲它不能正常工作 - 是否出現錯誤或其他反饋? –

+0

看起來你需要能夠對來自Access的數據請求應用一個過濾器(我對於從Access到MySQL的請求數據動態地做些什麼可能會生鏽)。 –