Сортировка по определённому порядку в MySQL запросе

Если нужно отсортировать список по определённому порядку, например список чисел с начала 4,5,1 и далее по возрастающей, то можно создать правило сортировки например с параметром условия с дополнительными колонками для сортировки:

SELECT id,
-- дополнительные колонки для сортировки
IF(id=4, 1, 0) c1, IF(id=5, 1, 0) c2, IF(id=1, 1, 0) c3 
FROM test 
WHERE id IN(1,2,3,4,5,6,7,8,9,10)
-- теперь сортируем по дополнительным колонкам по убывающей и далее по возрастающей
ORDER BY c1 DESC, c2 DESC, c3 DESC, id ASC

Ответ запроса:

id	c1	c2	c3
4	1	0	0
5	0	1	0
1	0	0	1
6	0	0	0
7	0	0	0
8	0	0	0
9	0	0	0
10	0	0	0

В этом варианте условие возвращает 1 или 0, так как по возрастающей сортировке 0 выше 1 поэтому делаем обратную сортировку по убывающей, тогда значения в дополнительных колонках будут первыми. В MySQL операторы можно использовать и сразу в сортировке, тогда запрос изменяется так:

SELECT id 
FROM test 
WHERE id IN(1,2,3,4,5,6,7,8,9,10)
-- сортируем по условиям
ORDER BY IF(id=4, 1, 0) DESC, IF(id=5, 1, 0) DESC, IF(id=1, 1, 0) DESC, id ASC

Ответ запроса:

id
4
5
1
6
7
8
9
10

Так как операторы условий возвращают 0 или 1, то их можно сократить сравниванием, тогда запрос будет такой:

SELECT id 
FROM test 
WHERE id IN(1,2,3,4,5,6,7,8,9,10)
-- сортируем по сравниваниям
ORDER BY id=4 DESC, id=5 DESC, id=1 DESC, id ASC

Ответ запроса такой же:

id
4
5
1
6
7
8
9
10

Вместо оператора условия можно использовать например CASE:

SELECT id
FROM test 
WHERE id IN(1,2,3,4,5,6,7,8,9,10)
ORDER BY 
-- сортируем по выбору
CASE id
    WHEN 4 THEN 1
    WHEN 5 THEN 2
    WHEN 1 THEN 3
    ELSE 4
END ASC

Ответ запроса такой же:

id
4
5
1
6
7
8
9
10
Запись опубликована в рубрике Программирование с метками , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт защищен политикой конфиденциальности и условиями использования reCAPTCHA и Google.