#php #mysql #sorting #sql-order-by
#php #mysql #сортировка #sql-order-by
Вопрос:
У меня есть следующие 3 значения, которые могут быть в строке в базе данных — ВКЛЮЧЕНО, ВЫКЛЮЧЕНО, ПРОДАНО (столбец sort_it). Когда я устанавливаю клаузулу сортировки в ПОРЯДКЕ ПО sort_it ASC, таким образом, я получу элементы со значением в столбце sort_in ИЗ, затем ON и SOLD. Но мне нужна последовательность ВКЛ, ВЫКЛ, ПРОДАНО.
Существует какой-либо способ сделать это каким-либо образом? Я имею в виду … редактировать способ сохранения данных в базу данных будет требовательным, поэтому я бы сделал это в последний момент.
Комментарии:
1. Надеюсь, это перечисления, а не строки.
Ответ №1:
Да, вы можете использовать пользовательские сортировки данных, подобные этой:
SELECT * FROM table ORDER BY FIELD(`sort_it`,'ON','OFF','SOLD'),`sort_it`
Комментарии:
1. Это должно быть
,'ON','OFF','SOLD'
. В противном случае 1.2. Исправлен порядок в соответствии с mellamokb
Ответ №2:
Вы можете использовать CASE
инструкцию для генерации пользовательской последовательности упорядочения из базовых значений, что-то вроде этого:
ORDER BY
CASE sort_it
WHEN 'ON' then 1
WHEN 'OFF' then 2
WHEN 'SOLD' then 3
END
Пример демо:http://sqlize.com/MGz6lLb0Qk
Ответ №3:
Использование строк, как правило, плохая идея. было бы лучше использовать числовой тип. Затем вы можете сказать ВКЛ = 1, ВЫКЛ = 2 и ПРОДАНО = 3, а затем отсортировать.
Комментарии:
1. или используйте тип: ENUM, который (в фоновом режиме) является числовым значением, но вы также можете работать со строковыми метками: dev.mysql.com/doc/refman/5.0/en/enum.html
Ответ №4:
SELECT t.*, IF(sort_it='ON',1,IF(sort_it='OFF',2,3)) as new_sort FROM Table AS t ORDER by new_sort ASC
Другое решение из комментариев к руководству по MySQL:
http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html
select * from tablename order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;
Комментарии:
1. @Marcus: Я объединил два своих ответа.
2. Вашему первому решению нужен разделитель
,
вместо;
в каждомIF
операторе: sqlize.com/2vJ5f5t5pR