3

我搜索了带有日期的文章。在 MySQL 中是:

Article:
id | title
1  | first
2  | second
3  | third
4  | fourth

日期文章:

id | article_id | from       | to
1  |     1      | 10-10-2010 | 11-11-2010
2  |     2      | 11-10-2010 | 12-12-2010
3  |     1      | 13-12-2010 | 12-01-2012
4  |     3      | 11-11-2012 | 12-12-2012
5  |     4      | 02-02-2013 | 02-02-2014

我想获取所有带有日期的文章并按可用性排序。

例如,我想获取所有文章并按日期从 12-10-2011 到 12-01-2012 排序

这应该返回我:

  1. 第一个(在 FROM TO - DatesArticle.id = 3 范围内)
  2. 第三个(在 FROM TO - DatesArticle.id = 4 范围内)
  3. 第二个(不在 FROM TO 范围内)
  4. 第四(不在 FROM TO 范围内)

这对 SQL 或 SQL 和 PHP 可行吗?如果是,如何?

4

3 回答 3

3

使用子句 CASE,例如:

SELECT * FROM DatesArticle
ORDER BY CASE 
WHEN id=3 AND CURRENT_DATE()<=from and to < CURRENT_DATE()>=to THEN 1
WHEN <condition_2> THEN 2
etc...
ELSE <any other condition>
END

并不是说上面的内容会按原样工作,但它给了你和想法。如果您添加一个您尝试过的查询示例,或者您如何构建您的 where 子句,这将有助于获得更好的答案。

于 2012-07-06T11:59:27.103 回答
1

您必须首先加入表才能访问文章的数据。

然后您按逻辑条件订购(如果给定范围内有日期)。

SELECT title
FROM Article JOIN DatesArticle
  ON (Article.id = DatesArticle.id)
  ORDER BY DatesArticle.from > LastDate AND DatesArticle.to < FirstDate DESC;

(我从来没有在逻辑排序上得到正确的 ASC 和 DESC——试着看看会发生什么)

于 2012-07-06T12:46:48.823 回答
1

我的想法是当它的 id= 3 分配 1,如果 id = 4 分配 2,任何其他值分配 3,然后按照您分配的数字进行 where 条件和排序。

尝试这个:

select *,  
      case when t1.id=3 then 1 when t1.id=4 then 2 else 3 end as t
from article as t1 
join DatesArticle as t2 
on t1.id=t2.id
where CURRENT_DATE()<=from 
and to < CURRENT_DATE()
order by t
于 2012-07-06T12:29:28.150 回答