2009-06-09 79 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>;