2011-12-14 46 views
9

Tôi tìm nạp một mảng với tiêu đề cần làm và ngày đến hạn từ MySQL. Tôi muốn đặt hàng nó theo ngày và có lâu đời nhất trên đầu trang. Nhưng có một số todos không có ngày. Những todos tôi không muốn hiển thị ở vị trí đầu tiên mà là ở dưới cùng của danh sách của tôi. Thật không may, MySQL đặt những cái trống đầu tiên.PHP, MYSQL: Sắp xếp theo ngày nhưng ngày trống cuối cùng không phải trước tiên

Có cách nào tôi có thể làm điều đó trong một truy vấn (không thể sử dụng MySQLi, sử dụng ActiveRecord của CI). Tôi có thể chạy một truy vấn thứ hai cho tất cả các todos không có ngày và đặt chúng ở dưới cùng. Nhưng tôi muốn làm cho nó trong một truy vấn - nếu có thể?

Trả lời

31

Bạn có thể làm điều đó trong MySQL với mệnh đề ORDER BY. Sắp xếp trước NULL trước, sau đó là ngày.

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

Lưu ý: này giả định hàng mà không có một ngày là NULL.

+0

Cool :-) Hoạt động tốt! Tôi phải thay đổi những cái rỗng để NULL thay vì 0000-00-00 nhưng sau đó nó là chính xác những gì tôi cần. – suntrop

+1

Tốt. Có, 'NULL' là một biểu diễn tốt hơn cho hàng không có ngày hơn' 0000-00-00'. –

+1

DUDE I LOVE YOU! (Có điều này cố định vấn đề của tôi). –

0

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

có thể thêm một NVL(thedate, to_date('2099-12-31','yyyy-mm-dd')) theo thứ tự quy định tại khoản

0

Bạn có thể sử dụng này:

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

Tại sao sử dụng 'isnull()' * và * 'if()' –

0

Vâng, như một câu trả lời MySQL tinh khiết, có lẽ tôi sẽ làm điều đó như thế này.

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

'9999-12-31', thực sự? Có thật không! :) –

+5

@JasonMcCreary - Tôi nghĩ tôi sẽ chết vào lúc đó :) –

+3

Muhahahaha! Cảm ơn bạn đã đóng góp cho lỗi Y9999. –

Các vấn đề liên quan