2012-10-30 19 views
4

我有3張桌子,如何連接3個表格並按所有3的日期排序?

專輯,視頻和故事。

所有3個都有一個日期列,每個列都與subject_id列關聯。

我想選擇按日期排序的subject_id的所有專輯,視頻和故事,我該怎麼做?

現在我有這個疑問:

SELECT albums.*, videos.*, stories.* 
FROM albums 
LEFT JOIN videos 
ON videos.subject_id = albums.subject_id 
RIGHT JOIN stories 
ON stories.subject_id = albums.subject_id 
ORDER BY albums.date 

這會不會做的伎倆還是我失去了一些東西? 因爲我想要的日期不僅僅是專輯排序,故事可能會有更老的enteries然後專輯等等。

+1

所以最新的問題與您的查詢? –

+0

它不會按預期順序排列它們... –

+1

如果您可以獲得樣本結果 –

回答

1

如果我理解正確的,假定你總是希望在設定的最早日期按升序排序,你可以這樣做:

ORDER BY LEAST(albums.date, videos.date, stories.date) 

「最小」是Oracle的函數,返回最小(即最早的)值。雖然我不知道這是你想要什麼或者

ORDER BY CASE 
    WHEN albums.date <= videos.date AND albums.date <= stories.date THEN albums.date 
    WHEN videos.date <= albums.date AND videos.date <= stories.date THEN videos.date 
    ELSE stories.date 

:如果你是一個數據庫上沒有simliar命令你可以使用一個CASE語句。你將在一行中擁有大量的專輯,視頻和故事信息。如果你想要爲每個不同的專輯,視頻或故事添加一行,那麼你可能需要一個UNION而不是一組JOIN,但是你必須確保使用相同的字段。例如,如果你在,你想看到每個表中的標題字段,你可以使用:

SELECT * FROM (
    SELECT 'Album' as RowType, album_title as title, subject_id, date from albums 
    UNION 
    SELECT 'Video' as RowType, video_title as title, subject_id, date from videos 
    UNION 
    SELECT 'Story' as RowType, story_title as title, subject_id, date from stories 
    ) 
ORDER BY subject_id, date 

這將使排序順序,我相信你想(或者你可以把subject_id出的順序BY如果你喜歡)。關於UNION唯一的事情是你必須在每個基礎查詢中返回相同的列,所以如果你想從專輯獲得與來自視頻相比完全不同的信息,它將變得棘手。

+0

謝謝芯片,這正是我需要的!忘了UNION :) –

3

你會想

ORDER BY albums.date, videos.date, stories.date 

該更換

ORDER BY albums.date 

將專輯日期順序首先,內內則視頻日期和故事日期。我認爲這會讓你找到你想要的。

+0

我希望他們一起訂購,而不是在其他訂單之後 –

+0

@ eric.itzhak訂購時,它是什麼意思? – nawfal

+0

所有3個表格都有日期列,我希望結果按未按表格分組的所有日期排序。這意味着如果專輯有2行,2012年和2010年一個,故事2011年和2009年有一個,所以結果將是2009-2010-2011-2012(當然那些是完整日期) –