Всем привет. Совсем недавно появилась задача отсортировать данные в MySQL таблице таким образом, чтобы определенные данные шли в указанном порядке, а все остальные — по алфавиту. Сама таблица состоит из идентификатора (ID) и наименования (name). Изначально все данные из этой таблицы выводились без какой-либо сортировки, а тупо по порядку:
Предпочтительный вариант сортировки
Наиболее «правильным» вариантом будет создание нового поля в этой таблице с типом (int) и уже по нему делать нужную сортировку. При желании можно сделать интерфейс для пользователей, у которых будет возможность самостоятельно менять порядок элементов, выведенных на страницы. Возможно даже перетаскиванием. Предположим у нас есть таблица на 1000 строк. Пусть это будут города. И вам нужно первые 10-20 городов вывести в определенном порядке, а все остальные — после уже по алфавиту. Вероятно по умолчанию у нового поля все значения будут NULL, так как заполнять их вручную вы явно не захотите. Поэтому запрос будет таким:
1
2
| SELECT * FROM city ORDER BY `sorting`
IS NULL, `sorting` ASC, `name` ASC |
SELECT * FROM city ORDER BY `sorting`
IS NULL, `sorting` ASC, `name` ASC
Получаем результат:
Способ сортировки SQL без добавления нового поля
Существует еще один вариант и он тоже имеет право на жизнь. В нем так же данные будут отсортированы по заданным характеристикам, а все остальные по алфавиту в порядке возрастания. Запрос, в этом случае, будет таким:
1
2
3
| SELECT id, name
FROM city
ORDER BY FIELD(id, 1, 6, 2, 4, 7, 3, 79, 108, 89, 110, id), `name` ASC |
SELECT id, name
FROM city
ORDER BY FIELD(id, 1, 6, 2, 4, 7, 3, 79, 108, 89, 110, id), `name` ASC
На выходе получаем:
Как вы понимаете, в скобках мы перечисляем ID, которые будут идти по порядку. Возможно для кого-то этот вариант окажется предпочтительней, так как нет необходимости создавать новое поле в таблице. Но тогда могут возникнуть сложности с веб-интерфейсом, если он конечно вам нужен. А в целом сортировка SQL в определенном порядке и по алфавиту будет работать так же хорошо.
Если у вас есть еще идеи по данной теме, то прошу высказать в комментариях.
Добавить комментарий