SQL Query bir başlangıç ​​ve bitiş tarihi ile etkinlik seçmek için

2 Cevap php

Ben bir veritabanından gelecek olayları görüntülemek gerekir. Ben şu anda geçti bir başlangıç ​​gün bir etkinlik kullanıyorum sorgusu kullandığınızda sorun bunlar geçerli olursa olsun gerçeğin yaklaşan etkinlikleri listesinde alt göstermek olacaktır

Benim tablo (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

Benim sorgu (doktrin):

    $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);

Temelde ben şu anda oluyor bir etkinlik istiyorum (yani bugün START_DAY ve END_DAY arasında ise) listenin en üstünde olmak. Hatta mümkün ise bunu nasıl yapıyor hakkında gitmek istiyorsunuz? Onlar DQL dönüşmesi oldukça kolaydır çünkü çok çiğ sql sorguları iyi cevaplar.

SOLUTION Based on one of the below answers:

    $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 Cevap

Bu yapmanız gerekir:

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

Sen kullanabilirsiniz case.

Add a case when current date is between start and end date, with score 1. All the others with score 0

Ve sonra skora göre sipariş.