Как сортировать строки по включению, ВЫКЛЮЧЕНИЮ, ПРОДАНО

#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