以下是交易。我有文章和問題,兩者都可以有發佈日期。 (問題必須,文章可以。)無論日期早於發佈日期。以最早的日期爲準訂購
我已經得到了所有的邏輯基本上已經解決了,並且它完美地工作,除非我無法完全弄清楚在這個發佈日期排序的訂單子句。 什麼是最簡潔的SQL方法來實現此功能?我知道基本的SQL結構和whatnot,但沒有這種先進的邏輯...
在此先感謝! --Matchu
以下是交易。我有文章和問題,兩者都可以有發佈日期。 (問題必須,文章可以。)無論日期早於發佈日期。以最早的日期爲準訂購
我已經得到了所有的邏輯基本上已經解決了,並且它完美地工作,除非我無法完全弄清楚在這個發佈日期排序的訂單子句。 什麼是最簡潔的SQL方法來實現此功能?我知道基本的SQL結構和whatnot,但沒有這種先進的邏輯...
在此先感謝! --Matchu
這將工作:
order by
case when article.date is not null and article.date<issue.date then article.date
else issue.date end
由基準日(雜誌),然後發行日期你秩序。
按訂單排序,文章。
此外,如果你有一個問題編號,那麼你可以使用這些數字來訂購你的東西,因爲音量和問題編號往往會隨着時間的推移不斷增加。
假設你有一個表,兩個日期(這部分我也不清楚)和ArticleReleaseDate
是空的,你要像
ORDER BY (CASE
WHEN IssueReleaseDate < ArticleReleaseDate OR ArticleReleaseDate IS NULL
THEN IssueReleaseDate
ELSE ArticleReleaseDate
END)
讓我們假設你已經有了一些文章,其每個都屬於一個問題。 (如在,雜誌的問題,我猜)。您希望在發佈時對它們進行排序,這是問題發佈日期,或者在某些情況下文章有自己的發佈日期。無論哪個日期更早是排序值。
要做到這一點,我們必須對您的數據庫做一些假設。我會告訴你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)"
而非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>;
你的模式是什麼? – 2009-06-09 03:01:23
你是說你有像(thingId,releaseDate)這樣的表,還是像(thingId,issueDate,articleDate)?是否總是存儲日期,還是可以爲空? Mysql,mssql,其他? – ahains 2009-06-09 03:02:55
相關信息:文章有(日期[可以是null],issue_id),問題有(id,日期[不能爲空]) – Matchu 2009-06-09 14:29:53