Итак, в моей базе данных я храню названия музыкальных инструментов (и другие различные атрибуты). Допустим, 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
(это было бы слишком просто, не правда ли ...), как я мог бы ввести какую-то систему заказов для правильного отображения инструментов?
После мозгового штурма я нашел одно решение:
Я мог бы добавить еще один столбец типа integer и «ранжировать» инструменты в зависимости от их важности (то есть Piccolos будет «1», флейты «2» и т. Д.):
... 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 путем анализа всего числа вместо числа по номеру?