SQL Query用于选择具有开始和结束日期的即将发生的事件

时间:2010-05-22 16:58:39

标签: php mysql doctrine

我需要显示来自数据库的即将发生的事件。问题是,当我使用查询时,我正在使用任何已经过去的开始日期的事件将在即将发生的事件列表中显示较低,而不管它们是否是最新事实

我的桌子(yaml):

  columns:
    title:
      type: string(255)
      notnull: true
      default: Untitled Event
    start_time:
      type: time
    end_time:
      type: time
    start_day:
      type: date
      notnull: true
    end_day:
      type: date
    description:
      type: string(500)
      default: This event has no description
    category_id: integer

我的查询(学说):

    $results = Doctrine_Query::create()
        ->from("sfEventItem e, e.Category c")
        ->select("e.title, e.start_day, e.description, e.category_id, e.slug")
        ->addSelect("c.title, c.slug")
        ->orderBy("e.start_day, e.start_time, e.title")
        ->limit(5)
        ->execute(array(), Doctrine_Core::HYDRATE_ARRAY);

基本上我希望当前正在进行的任何事件(如果今天在start_day和end_day之间)都位于列表的顶部。如果可能的话,我该怎么做呢?原始的SQL查询也是很好的答案,因为它们很容易变成DQL。

基于以下答案之一:

    $results = Doctrine_Query::create()
        ->from("sfEventItem e, e.Category c")
        ->select("e.title, e.start_day, e.description, e.category_id, e.slug")
        ->addSelect("c.title, c.slug")
        ->addSelect("IF(NOW() BETWEEN e.start_day AND e.end_day,0,1) as score")
        ->orderBy("score, e.start_day, e.start_time, e.title")
        ->limit(5)
        ->execute(array(), Doctrine_Core::HYDRATE_ARRAY);

2 个答案:

答案 0 :(得分:3)

这应该做:

->orderBy("IF(NOW() BETWEEN e.start_day AND e.end_day,0,1) , e.start_day, e.start_time, e.title")

答案 1 :(得分:2)

您可以使用case

当前日期在开始日期和结束日期之间添加一个案例,得分为1。 所有其他得分为0

然后按分数排序。