2009-06-09 73 views
1

以下是交易。我有文章和問題,兩者都可以有發佈日期。 (問題必須,文章可以。)無論日期早於發佈日期。以最早的日期爲準訂購

我已經得到了所有的邏輯基本上已經解決了,並且它完美地工作,除非我無法完全弄清楚在這個發佈日期排序的訂單子句。 什麼是最簡潔的SQL方法來實現此功能?我知道基本的SQL結構和whatnot,但沒有這種先進的邏輯...

在此先感謝! --Matchu

+0

你的模式是什麼? – 2009-06-09 03:01:23

+0

你是說你有像(thingId,releaseDate)這樣的表,還是像(thingId,issueDate,articleDate)?是否總是存儲日期,還是可以爲空? Mysql,mssql,其他? – ahains 2009-06-09 03:02:55

+0

相關信息:文章有(日期[可以是null],issue_id),問題有(id,日期[不能爲空]) – Matchu 2009-06-09 14:29:53

回答

1

這將工作:

order by 
case when article.date is not null and article.date<issue.date then article.date 
else issue.date end 
0

由基準日(雜誌),然後發行日期你秩序。

按訂單排序,文章。

此外,如果你有一個問題編號,那麼你可以使用這些數字來訂購你的東西,因爲音量和問題編號往往會隨着時間的推移不斷增加。

0

假設你有一個表,兩個日期(這部分我也不清楚)和ArticleReleaseDate是空的,你要像

ORDER BY (CASE 
    WHEN IssueReleaseDate < ArticleReleaseDate OR ArticleReleaseDate IS NULL 
    THEN IssueReleaseDate 
    ELSE ArticleReleaseDate 
    END) 
0

讓我們假設你已經有了一些文章,其每個都屬於一個問題。 (如在,雜誌的問題,我猜)。您希望在發佈時對它們進行排序,這是問題發佈日期,或者在某些情況下文章有自己的發佈日期。無論哪個日期更早是排序值。

要做到這一點,我們必須對您的數據庫做一些假設。我會告訴你MySQL,但是如果需要的話,也許有人會提供一個到另一個RDBMS的翻譯。

Article.all :include => :issue, :order => "if((isnull(articles.release_date) OR articles.release_date > issues.release_date), issues.release_date, articles.release_date)" 
0

而非ORDER BY子句中定位排序邏輯(如其他建議在這裏),我想你應該暴露的排序順序通過SELECT條款的「最終用戶」;如果您的數據庫管理系統符合SQL-92標準,則只能在ORDER BY子句中使用相關名稱,例如

SELECT COALESCE(CASE 
        WHEN V1.issue_release_date <= V1.article_release_date 
         THEN V1.issue_release_date 
        ELSE V1.article_release_date 
       END, V1.issue_release_date) AS considered_release_date, 
     <other columns here> 
    FROM ... 
ORDER 
    BY considered_release_date, <other correlation names here>;