Сортировка выходных данных строк SQL в произвольном порядке?
Итак, в моей базе данных я храню названия музыкальных инструментов (и различные другие атрибуты). Предположим, что id
является первичным ключом, а name
- уникальным ключом.
В PHP-скрипте я выбираю элементы по их классу инструментов, например:
$name = mysql_real_escape_string($_POST['name']);
$row = mysql_fetch_row(mysql_query("SELECT * FROM `instruments` WHERE name LIKE '%$name%' ORDER BY id"));
Таблица результатов:
id name
1 "Flute 2"
2 "Bass Flute"
3 "Flute 10"
4 "Flute 7"
Это позволяет мне выбрать все семейство инструментов, таких как" сопрано-саксофон"," альт-саксофон "и т. д., просто задав вопрос"саксофон".
В этом конкретном примере результаты таковы: или по их идентификатору (который, как вы можете предположить, является auto_incremented). Более идеальным было бы упорядочение по алфавиту, да?
id name
2 "Bass Flute"
3 "Flute 10"
1 "Flute 2"
4 "Flute 7"
Это прекрасно работает, но будучи музыкантами, они любят возиться с администратором БД и не любят, чтобы "басовые флейты" были перечислены выше "флейты" в результатах флейты, и действительно не любят, чтобы "флейта 10" была указана перед "флейтой 2".
Итак, поскольку нет ORDER BY score_order
(это было бы слишком просто, не так ли?..), как я мог ввести какую-то систему заказа, чтобы правильно отображать приборы?
... nts` WHERE name LIKE '%$name%' ORDER BY rank, name"));
id name rank
3 "Flute 10" 2
1 "Flute 2" 2
4 "Flute 7" 2
2 "Bass Flute" 5
Однако это не объясняет тот факт, что "флейта 10" предшествует "флейте 2", буквенно-цифровой.
Идеальная таблица результатов (упорядоченная по rank
, а затем по name
):
id name rank
6 "Piccolo" 1
1 "Flute 2" 2
4 "Flute 7" 2
3 "Flute 10" 2
5 "Alto Flute" 4
2 "Bass Flute" 5
Итак, мои вопросы:
-
Возможно ли такое решение и стоит ли прилагать усилия для его реализации?
- Есть ли способ иметь записи порядка SQL, анализируя все число, а не число за числом?
Спасибо!
4 ответа:
Мне не совсем ясно, каким будет ваш идеальный порядок сортировки, но вам, вероятно, следует просто сделать его дополнительным столбцом в таблице базы данных. Вы говорите, что
ORDER BY score_order
было бы слишком просто, но почему бы не добавить явное полеscore_order
и не упорядочить его?
Вы можете создать другой порядок, делая что-то вроде этого. Это халтура.
select * from table order by ( case name when 'Health' then 0 when 'Flute 10' then 1 when 'Freeze' then 2 when 'Bass Flute' then 3 end )
И, вероятно,лучше использовать столбец id.
select * from table order by ( case id when 3 then 0 when 1 then 1 when 4 then 2 when 2 then 3 end )
Я бы поставил в вашей таблице столбец "приоритет". Затем упорядочить его по наиболее важным (например, базовые инструменты будут 0: Флейта, Саксофон и т. д., модификации будут 1: бас-флейта, альтовая флейта и т. д., а приоритет чисел будет их число + 100 или что-то, чтобы поставить их в конце, но все еще в числовом порядке).
Лучший способ сортировки чисел (а затем в алфавитном порядке в случаях одинакового приоритета) численно-это использование чисел.
Edit: Итак, вышеизложенное дало бы вы что-то вроде этого (приоритет находится в parentheis):
Флейта (0)
Басовая Флейта (1)
Тенор Флейта (1)
Флейта 1 (101)
Флейта 2 (102)
Флейта 10 (110)