12

I fetch an array with todo titles and due dates from MySQL. I want to order it by date and have the oldest on top. But there are some todos without a date. These todos I don't want to show at first positions but rather at the bottom of my list. Unfortunately MySQL put the empty ones first.

Is there any way I can do it in one query (can't use MySQLi, using CI's ActiveRecord). I could run a second query for all todos without dates and put them at the bottom. But I'd like to make it in one query – if possible?

5 Answers 5

40

You can do it in MySQL with the ORDER BY clause. Sort by NULL first, then the date.

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

Note: This assumes rows without a date are NULL.

Sign up to request clarification or add additional context in comments.

2 Comments

Cool :-) Works fine! I have to change the empty ones to NULL instead of 0000-00-00 but then it is exactly what I need.
Good. Yes, NULL is a much better representation for row without a date than 0000-00-00.
1

Yes

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

Comments

0

possibly add a NVL( thedate, to_date('2099-12-31','yyyy-mm-dd')) in the order by clause

Comments

0

You can use this:

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

1 Comment

Why the use of isnull() and if()
-1

Well, as a pure MySQL answer, I would probably do it like this.

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.