There is a tasks table. It has a status column of type enum(todo, inprogress, done)
SELECT * FROM tasks;
-- +----+----------------------+------------+
-- | id | name | status |
-- +----+----------------------+------------+
-- | 1 | Write blog post | todo |
-- | 2 | Fix bug #342 | inprogress |
-- | 3 | Design homepage | done |
-- | 4 | Update documentation | todo |
-- | 5 | Deploy to staging | inprogress |
-- | 6 | Plan sprint meeting | done |
-- | 7 | Refactor codebase | todo |
-- | 8 | Test new features | inprogress |
-- | 9 | Clean up database | done |
-- | 10 | Create wireframes | todo |
-- +----+----------------------+------------+
-- 10 rows in set (0.01 sec)
Suppose we want to select all the tasks sorted by the status — inprogress comes first, todo second, and done last.
If we use ORDER BY status, the tasks will be sorted based on the index in the enum definition. So the result will be todo comes first, inprogress second, and done last. For example:
SELECT * FROM tasks
ORDER BY status;
-- +----+----------------------+------------+
-- | id | name | status |
-- +----+----------------------+------------+
-- | 1 | Write blog post | todo |
-- | 4 | Update documentation | todo |
-- | 7 | Refactor codebase | todo |
-- | 10 | Create wireframes | todo |
-- | 2 | Fix bug #342 | inprogress |
-- | 5 | Deploy to staging | inprogress |
-- | 8 | Test new features | inprogress |
-- | 3 | Design homepage | done |
-- | 6 | Plan sprint meeting | done |
-- | 9 | Clean up database | done |
-- +----+----------------------+------------+
-- 10 rows in set (0.00 sec)
To solve this, we can use the CASE clause in ORDER BY. In the CASE clause, each value in the enum becomes a condition and is assigned a number. The smallest number will appear first in the order.
For example:
SELECT * FROM tasks
ORDER BY CASE
WHEN status = 'inprogress' THEN 1
WHEN status = 'todo' THEN 2
ELSE 3
END;
-- +----+----------------------+------------+
-- | id | name | status |
-- +----+----------------------+------------+
-- | 2 | Fix bug #342 | inprogress |
-- | 5 | Deploy to staging | inprogress |
-- | 8 | Test new features | inprogress |
-- | 1 | Write blog post | todo |
-- | 4 | Update documentation | todo |
-- | 7 | Refactor codebase | todo |
-- | 10 | Create wireframes | todo |
-- | 3 | Design homepage | done |
-- | 6 | Plan sprint meeting | done |
-- | 9 | Clean up database | done |
-- +----+----------------------+------------+
-- 10 rows in set (0.00 sec)
As we can see in the result, the tasks are sorted by the status column — inprogress comes first, todo second, and done last.
Here's the syntax to use the CASE clause:
CASE
WHEN condition1 THEN condition1value
WHEN condition2 THEN condition2value
WHEN conditionN THEN conditionNvalue
ELSE otherconditionvalue
END;
Summary
The example above is how to sort data by enum values in MySQL using the CASE clause. There are other ways to solve this problem — for example, we can use the FIELD function, modify the enum order, and so on.
Top comments (0)