Сортировка по конкретным значениям

09 Августа 2023 14:56

В случаях когда нужна сложная сортировка, например, вывести сначала те, строки, у которых поля равны конкретным значениям, а потом уже со значениями других полей без учета первых, можно использовать конструкцию 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 будет в самом конце.