Sorting in User-Defined Orders
6.18.1 Problem
You want to define the sort order for all values in a column.
6.18.2 Solution
Use FIELD( ) to map column values onto a sequence that places the values in the desired order.
6.18.3 Discussion
The previous section showed how to make a specific group of rows go to the head of the sort order. If you want to impose a specific order on all values in a column, use the FIELD( ) function to map them to a list of numeric values and use the numbers for sorting. FIELD( ) compares its first argument to the following arguments and returns a number indicating which one of them it matches. The following FIELD( ) call compares value to str1, str2, str3, and str4, and returns 1, 2, 3, or 4, depending on which one of them value is equal to:
FIELD(value,str1,str2,str3,str4)
The number of comparison values need not be four; FIELD( ) takes a variable-length argument list. If value is NULL or none of the values match, FIELD( ) returns 0.
FIELD( ) can be used to sort an arbitrary set of values into any order you please. For example, to display driver_log records for Henry, Suzi, and Ben, in that order, do this:
mysql> SELECT * FROM driver_log -> ORDER BY FIELD(name,'Henry','Suzi','Ben'); +--------+-------+------------+-------+ | rec_id | name | trav_date | miles | +--------+-------+------------+-------+ | 3 | Henry | 2001-11-29 | 300 | | 4 | Henry | 2001-11-27 | 96 | | 6 | Henry | 2001-11-26 | 115 | | 8 | Henry | 2001-12-01 | 197 | | 10 | Henry | 2001-11-30 | 203 | | 2 | Suzi | 2001-11-29 | 391 | | 7 | Suzi | 2001-12-02 | 502 | | 1 | Ben | 2001-11-30 | 152 | | 5 | Ben | 2001-11-29 | 131 | | 9 | Ben | 2001-12-02 | 79 | +--------+-------+------------+-------+
You can use FIELD( ) with column substrings, too. To sort items from the housewares table by country of manufacture using the order US, UK, JP, SG, do this:
mysql> SELECT id, description FROM housewares -> ORDER BY FIELD(RIGHT(id,2),'US','UK','JP','SG'); +------------+------------------+ | id | description | +------------+------------------+ | DIN40672US | dining table | | BTH00485US | shower stall | | KIT00372UK | garbage disposal | | KIT01729JP | microwave oven | | BTH00415JP | lavatory | | BED00038SG | bedside lamp | +------------+------------------+
More generally, FIELD( ) can be used to sort any kind of category-based values into specific orders when the categories don't sort naturally into any useful sequence.