Итак, в моей базе данных хранятся имена музыкальных инструментов (и различные другие атрибуты). Предположим, что 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"
Это позволяет мне выбрать все семейство инструментов, таких как «Saprano Saxophone», «Alto Saxophone» и т. Д., Просто запросив «саксофон».
В этом конкретном примере результаты подтверждаются их идентификатором (который вы можете считать aut_incremented). Более идеальным было бы упорядочение по алфавитному порядку, да?
id name 2 "Bass Flute" 3 "Flute 10" 1 "Flute 2" 4 "Flute 7"
Это прекрасно работает, но, будучи музыкантами, они любят шутить с администратором БД и не любезно относятся к тому, чтобы «Флейты баса», перечисленные выше «Флейта» в результатах флейты, и на самом деле не любезно относятся к тому, Флейта 10 ", указанная перед« Флейтой 2 ».
Итак, видя, что нет ORDER BY score_order
(это было бы слишком легко, не так ли …), как я мог бы ввести какую-то систему заказов для правильного отображения инструментов?
После мозгового штурма я пришел к одному решению: я мог бы добавить еще один столбец типа integer и «ранжировать» инструменты, основанные на их важности (то есть Piccolos будет «1», «Flutes» 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
Итак, мои вопросы:
Благодаря!
Мне не совсем понятно, каков будет ваш идеальный порядок сортировки, но вы, вероятно, должны просто добавить дополнительный столбец в таблицу базы данных. Вы говорите, что 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: бас-флейта, флейта Альто и т. Д. И приоритет Numerics – их число + 100 или что-то, что помещает их в но все же в числовом порядке).
Наилучшим способом сортировки чисел (а затем в алфавитном порядке в случаях с одним и тем же приоритетом) является численное использование чисел.
Изменить: Таким образом, вышесказанное даст вам что-то вроде этого (приоритет в родительской):
Флейта (0)
Бас-флейта (1)
Тенорная флейта (1)
Флейта 1 (101)
Флейта 2 (102)
Флейта 10 (110)