Сортировка выходных данных строк 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 (это было бы слишком просто, не так ли?..), как я мог ввести какую-то систему заказа, чтобы правильно отображать приборы?

Во время мозгового штурма я нашел одно решение.: Я мог бы добавить еще один столбец типа integer и" ранжировать " инструменты по их важности (то есть Пикколо будет "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

Итак, мои вопросы:

    Возможно ли такое решение и стоит ли прилагать усилия для его реализации?
  1. Есть ли способ иметь записи порядка SQL, анализируя все число, а не число за числом?

Спасибо!

4 2

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)

Используйте функцию MySQL FIELD (), например:

SELECT * FROM `instruments` WHERE `name` LIKE '%$name%'
ORDER BY FIELD( `name`,
    'Piccolo',
    'Flute 2',
    'Flute 7',
    'Flute 10',
    'Alto Flute',
    'Bass Flute'
)

[вставить предупреждение "parameterize your queries" здесь]