1. Easiest way is probably make a few queries.
-> Select sticky topics ordered by ...
-> Select normal topics ordered by ...
--------------------
2. If table is something like:
create table Message(id integer auto_increment, sticky bool, locked bool, PRIMARY KEY(id));
To sort in order:
1. Sticky and locked.
2. Sticky and unlocked
3. Unsticky and unlocked
4. Unsticky and locked
SELECT * FROM Message ORDER BY sticky DESC, IF(sticky AND locked, true, false) DESC, IF(NOT STICKY AND LOCKED, true, false) ASC;
For data set:
+----+--------+--------+
| id | sticky | locked |
+----+--------+--------+
| 1 | 0 | 0 |
| 2 | 0 | 1 |
| 3 | 1 | 0 |
| 4 | 1 | 1 |
| 5 | 1 | 0 |
| 6 | 0 | 1 |
| 7 | 1 | 1 |
| 8 | 0 | 0 |
+----+--------+--------+
It will produce output:
+----+--------+--------+
| id | sticky | locked |
+----+--------+--------+
| 4 | 1 | 1 |
| 7 | 1 | 1 |
| 3 | 1 | 0 |
| 5 | 1 | 0 |
| 1 | 0 | 0 |
| 8 | 0 | 0 |
| 2 | 0 | 1 |
| 6 | 0 | 1 |
+----+--------+--------+