We all know with MySQL you can use ORDER BY with a list of columns to return an ordered set, e.g. ORDER BY name, type, state;
I often use the syntax ORDER BY 1,2; which I’m surprised that some people do not know about.
However I needed to do some selective ordering of a type field, I didn’t want to for example have a lookup table just to join for ordering. While contemplating a means of achieving this, I asked a work colleague, who I figured may have just experienced this problem before. Lone behold I became the student as I discovered there is a third syntax with ORDER BY, using expressions.
mysql> create table test(name varchar(10) not null, type varchar(10) not null); Query OK, 0 rows affected (0.06 sec) mysql> insert into test(name,type) values ('Apples','Fruit'), ('Bananas','Fruit'), ('Carrots','Veg'), ('Onions','Veg'), ('Beer','Liquid'), ('Water','Liquid'), ('Crackers','Food'); Query OK, 7 rows affected (0.00 sec) Records: 7 Duplicates: 0 Warnings: 0 mysql> select name from test order by type='Veg' DESC, type='Fruit' DESC, type='Food' DESC, type='Liquid' DESC; +----------+ | name | +----------+ | Carrots | | Onions | | Apples | | Bananas | | Crackers | | Beer | | Water | +----------+ 7 rows in set (0.00 sec)
Of course, reading the MySQL Manual confirms this on the SELECT command
.
I’ve not read the MySQL manual from cover to cover, since 4.x days. Perhaps it’s time.
Thanks to Nick Pisarro of Blog Revolution for this most valuable tip.