Сортировка вывода строк SQL в произвольном порядке? - PullRequest
3 голосов
/ 06 февраля 2010

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

Ответы [ 4 ]

12 голосов
/ 06 февраля 2010

Вы можете создать другой заказ, делая что-то вроде этого. Это хак.

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
)
1 голос
/ 06 февраля 2010

Мне не совсем ясно, каким был бы ваш идеальный порядок сортировки, но вам, вероятно, следует просто сделать его дополнительным столбцом в таблице базы данных. Вы говорите, что ORDER BY score_order было бы слишком просто, но почему бы не добавить явное поле score_order и порядок по нему?

1 голос
/ 06 февраля 2010

Что бы я сделал, это поместил столбец «приоритет» в вашу таблицу. Затем упорядочите его по наиболее важным (например, базовые инструменты будут 0: флейта, саксофон и т. Д., Модификации будут 1: басовая флейта, альт-флейта и т. Д., А приоритетом чисел будет их число + 100 или что-то, чтобы поставить их на конец, но все еще в числовом порядке).

Лучший способ сортировки чисел (а затем в алфавитном порядке в случаях с одинаковым приоритетом) с использованием чисел.

Редактировать: Итак, приведенное выше даст вам что-то вроде этого (приоритет указан в скобках):
Флейта (0)
Басовая флейта (1)
Тенор Флейта (1)
Флейта 1 (101)
Флейта 2 (102)
Флейта 10 (110)

0 голосов
/ 20 марта 2018

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

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

[вставьте предупреждение «параметризовать свои запросы» здесь]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...