2011-12-14 8 views
9

Pobieram tablicę z tytułami todo i datami z MySQL. Chcę zamówić według daty i mieć najstarsze na górze. Ale jest trochę todos bez randki. Te todos, których nie chcę pokazywać na pierwszych pozycjach, ale raczej na dole mojej listy. Niestety MySQL najpierw wstawił puste.PHP, MYSQL: Sortuj według daty, ale puste daty nie są najpierw

Czy jest jakiś sposób mogę to zrobić w jednym zapytaniu (nie można używać MySQLi, używając ActiveRecord CI). Mógłbym uruchomić drugie zapytanie dla wszystkich todos bez dat i umieścić je na dole. Ale chciałbym zrobić to w jednym zapytaniu - jeśli to możliwe?

Odpowiedz

31

Możesz to zrobić w MySQL z klauzulą ​​ORDER BY. Najpierw sortuj według NULL, a następnie datę.

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

Uwaga: zakłada to wiersze bez daty są NULL.

+0

Fajnie :-) Działa dobrze! Muszę zmienić puste na NULL zamiast 0000-00-00, ale wtedy jest dokładnie to, czego potrzebuję. – suntrop

+1

Dobrze. Tak, 'NULL' jest znacznie lepszą reprezentacją wiersza bez daty niż' 0000-00-00'. –

+1

DUDE KOCHAM CIĘ! (Tak, to naprawiło mój problem). –

0

Tak

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

ewentualnie dodać NVL(thedate, to_date('2099-12-31','yyyy-mm-dd')) w kolejności przez klauzuli

0

Można to wykorzystać:

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

Dlaczego użycie 'isnull()' * i * 'if()' –

0

Cóż, jako czysta odpowiedź MySQL, to pewnie zrobić lubię to.

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

'9999-12-31', naprawdę? Naprawdę! :) –

+5

@JasonMcCreary - Myślę, że będę martwy do tego czasu :) –

+3

Muhahahaha! Dziękujemy za przyczynienie się do błędu Y9999. –