В случаях когда нужна сложная сортировка, например, вывести сначала те, строки, у которых поля равны конкретным значениям, а потом уже со значениями других полей без учета первых, можно использовать конструкцию ORDER BY CASE
.
Пример.
У нас есть таблица workers с полями: name, dob, worker_app_exit , worker_app_accept, app_verified .
На этом этапе мы можем сортировать строки по разным комбинациям.
Например, так:
SELECT DISTINCT *
FROM workers
WHERE partnership_id = 17
AND supervisor_id = 3613
ORDER BY
CASE
WHEN app_verified = 2 THEN 2
WHEN app_verified = -1 THEN 1
WHEN worker_app_exit = 1 THEN 0
WHEN worker_app_accept = 1 AND app_verified = 1 THEN 10
WHEN worker_app_accept = 1 AND app_verified = 0 THEN 9
WHEN worker_app_accept = 0 AND app_verified = 1 THEN 8
WHEN worker_app_accept = 0 AND app_verified = 0 THEN 7
WHEN worker_app_accept = 2 AND app_verified = 1 THEN 6
WHEN worker_app_accept = 2 AND app_verified = 0 THEN 5
WHEN worker_app_accept = -1 AND app_verified = 1 THEN 4
WHEN worker_app_accept = -1 AND app_verified = 0 THEN 3
END DESC
LIMIT 100;
Здесь важно отметить, что если мы после комбинаций с worker_app_accept и app_verified мы хотим, чтобы заключительными этапами сортировки были конкретные значения app_verified, а то и значение совсем другого поля, например worker_app_exit то тут может получиться такая ситуция, что у них так же будут присутствовать значения worker_app_accept = 1(0) или app_verified = 0(1) и они подпадут под условие выше. Чтобы повысить приоритет поля worker_app_exit над приоритетом предыдущих полей, нужно условие с worker_app_exit вывести вверх т.к. приоритет WHEN работает по принципу "Первое условие самое главное". То есть мы в самом начале объявляем, что worker_app_exit будет в самом конце.