SQL-запрос для выбора предстоящих событий с начальной и конечной датой - PullRequest
4 голосов
/ 22 мая 2010

Мне нужно отобразить предстоящие события из базы данных. Проблема в том, что когда я использую запрос, который я использую в настоящее время, любые события с прошедшим днем ​​начала будут отображаться ниже в списке предстоящих событий независимо от того, являются ли они текущими

Мой стол (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);

По сути, я бы хотел, чтобы любые события, которые происходят в данный момент (поэтому, если сегодня между начальной и конечной датой), были в верхней части списка. Как бы я поступил так, если это вообще возможно? Необработанные 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 ]

3 голосов
/ 22 мая 2010

Это должно сделать:

->orderBy("IF(NOW() BETWEEN e.start_day AND e.end_day,0,1) , e.start_day, e.start_time, e.title")
2 голосов
/ 22 мая 2010

Вы можете использовать чехол .

Добавить случай, когда текущая дата находится между начальной и конечной датой со счетом 1. Все остальные со счетом 0

А потом упорядочить счет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...