2011-12-14 17 views
9

Todo başlıklarını ve MySQL'in son tarihlerini içeren bir dizi getiriyorum. Tarihe göre sipariş vermek ve en eskileri en üstte olmak istiyorum. Ama tarihsiz bazı todoslar var. Bu todosları ilk pozisyonlarda göstermek istemiyorum, ancak listemimin altında. Ne yazık ki MySQL önce boş olanları koydu.PHP, MYSQL: Tarihe göre sıralama fakat boş tarihler ilk kez değil

Tek bir sorguda yapabildiğim herhangi bir yol var mı (CI's ActiveRecord kullanarak MySQLi'yi kullanamıyorum). Tarihsiz tüm todoslar için ikinci bir sorgu çalıştırabilir ve en altta yerleştirebilirim. Ama mümkünse bir sorguda yapmak isterim.

cevap

31

MySQL içinde ORDER BY yan tümcesi ile yapabilirsiniz. Önce NULL'a göre sırala, sonra tarih.

SELECT * FROM your_table ORDER BY (date_column IS NULL), date_column ASC 

Not: Bu varsayar bir tarihi olmayan satırlar NULL bulunmaktadır.

+0

Cool :-) İyi çalışıyor! Boş olanları 0000-00-00 yerine NULL olarak değiştirmeliyim ama sonra tam ihtiyacım olan şey bu. – suntrop

+1

İyi. Evet, 'NULL', 0000-00-00'den çok bir tarih içermeyen satır için çok daha iyi bir sunum. –

+1

DUDE SEVİYORUM! (Evet bu benim sorunumu giderdi). –

0

Evet

SELECT * 
    FROM table 
    ORDER BY CASE your_date 
       WHEN '' THEN 'b' 
       ELSE 'a' 
      END, 
      date ASC 
0

muhtemelen maddesi ile sırayla bir NVL(thedate, to_date('2099-12-31','yyyy-mm-dd')) eklemek

0

Bunu kullanabilirsiniz:

select * from my_table 
order by if(isnull(my_field),1,0),my_field; 
+0

Neden isnull() '* ve *' if() ' –

0

Eh, saf MySQL cevap olarak, muhtemelen yapacağını bunun gibi.

select todo.title, todo.due_date 
    from todo 
    order by ifnull(todo.due_date, '9999-12-31') 
+0

' 9999-12-31' kullanımı gerçekten? Gerçekten mi! :) –

+5

@JasonMcCreary - Ben o zamana kadar öleceğim anladım :) –

+3

Muhahahaha! Y9999 böceğine katkıda bulunduğunuz için teşekkür ederiz. –

İlgili konular