Порядок mysql по нескольким условиям

У меня есть sql внизу, которые хотят сделать несколько ORDER BY.

SELECT
    r.*,
    s.uzunluq,
    b.id,
    au.status_id as aksessuar_status,
    au.aksessuar_id,
    au.aksessuar
FROM
    seksiya s,
    result r
LEFT JOIN bosh_seksiya_aksessuar b
    ON
    b.bosh_seksiya = r.model AND
    b.ERK = :ses
LEFT JOIN aksessuar_up au
    ON au.model_id = r.res_id AND
    au.user_id = :user_id AND
    au.status_id = 9
WHERE 
    r.user_id = :user_id AND
    r.model=s.seksiya AND 
    s.erk = :ses AND
    r.status_id IN (1,2,3,4,5)
ORDER BY 
    r.res_id

Я думаю, что писать php PDO для вас не важно, ребята, вызывают мой вопрос только с этим sql. Этот sql работает очень хорошо, я просто хочу добавить дополнительную функцию. Итак, посмотрите на этот столбец: r.status_id IN (1,2,3,4,5)

Я дал Order BY r.res_id

МОЙ вопрос: Я хочу использовать несколько ORDER для каждого status_id

КАК заказать:

ORDER BY r.res_id DESC WHERE r.status_id IN (1,2)

и

ORDER BY r.res_id WHERE r.status_id IN (3,4,5)

в этом sql?

Ответ 1

ORDER BY IF(r.status_id IN (1,2), r.res_id, NULL) DESC, r.res_id

Набор записей, отсортированный с этим предложением ORDER BY, сначала отобразит все записи с помощью r.status_id IN (1,2) (так как значения NULL приходят последним в порядке убывания), сами отсортированы в порядке убывания r.res_id; а затем все остальные значения, отсортированные по r.res_id в порядке возрастания.

Ответ 2

вы можете использовать синтаксис union:

SELECT * FROM ((SELECT
    r.*,
    s.uzunluq,
    b.id,
    au.status_id as aksessuar_status,
    au.aksessuar_id,
    au.aksessuar,
    1 as query_order
FROM
    seksiya s,
    result r
LEFT JOIN bosh_seksiya_aksessuar b
    ON
    b.bosh_seksiya = r.model AND
    b.ERK = :ses
LEFT JOIN aksessuar_up au
    ON au.model_id = r.res_id AND
    au.user_id = :user_id AND
    au.status_id = 9
WHERE 
    r.user_id = :user_id AND
    r.model=s.seksiya AND 
    s.erk = :ses AND
    r.status_id IN (1,2)
ORDER BY 
    r.res_id DESC) as table1
UNION
(SELECT
    r.*,
    s.uzunluq,
    b.id,
    au.status_id as aksessuar_status,
    au.aksessuar_id,
    au.aksessuar,
    0 as query_order
FROM
    seksiya s,
    result r
LEFT JOIN bosh_seksiya_aksessuar b
    ON
    b.bosh_seksiya = r.model AND
    b.ERK = :ses
LEFT JOIN aksessuar_up au
    ON au.model_id = r.res_id AND
    au.user_id = :user_id AND
    au.status_id = 9
WHERE 
    r.user_id = :user_id AND
    r.model=s.seksiya AND 
    s.erk = :ses AND
    r.status_id IN (3,4,5)
ORDER BY 
    r.res_id) as table2) sa table3 ORDER BY query_order