MySQL указывает произвольный порядок по идентификатору

Можно ли указать произвольный порядок для оператора MySQL SELECT? Например.,

SELECT * FROM table_name WHERE id IN (1, 3, 2, 9, 7) ORDER BY (1, 3, 2, 9, 7);

Порядок чисел, перечисленных непосредственно после IN, кажется, не имеет значения.


person ma11hew28    schedule 01.12.2010    source источник
comment
@MattDiPasquale — у вас уже есть порядок в 1,3,2,9,7, просто загрузите результаты для 1,2,3,9,7 и установите его на основе порядка 1,3,2,9,7. Любой указанный язык программирования?   -  person ajreal    schedule 01.12.2010
comment
Я использую WordPress, PHP. Я хотел бы сделать все это в MySQL, чтобы мне не приходилось выполнять какую-либо обработку в PHP.   -  person ma11hew28    schedule 01.12.2010
comment
@MattDiPasquale - find_in_set не быстрый и не очень оптимизированный. Делать это на PHP быстрее и оптимизированнее.   -  person ajreal    schedule 01.12.2010
comment
@ajreal find_in_set не медленный, если список не очень большой, mysql нужно только отсортировать 5 строк, которые он выбрал из Where   -  person The Scrum Meister    schedule 01.12.2010
comment
@The Scrum Meister - 5 строк не будут расти, но количество сообщений в блоге будет расти...   -  person ajreal    schedule 01.12.2010
comment
Когда вы упорядочиваете набор таких чисел, он упорядочивает набор результатов на основе полей field1, field3, field2, field9 и field7 в вашем SELECT *. Это сокращенный способ упорядочения столбцов без использования имен полей.   -  person Leslie    schedule 01.12.2010


Ответы (3)


Функция FIND_IN_SET сделает свое дело

SELECT * FROM table_name WHERE id IN (1, 3, 2, 9, 7) ORDER BY FIND_IN_SET(id, '1,3,2,9,7');

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

РЕДАКТИРОВАТЬ: Обратите внимание на отсутствие пробелов в строковом аргументе функции find_in_set.

person The Scrum Meister    schedule 01.12.2010
comment
Вы это тестировали? Когда я попробовал, у меня получился порядок: 2, 3, 7, 9, 1, что неверно. - person ma11hew28; 01.12.2010

Ознакомьтесь с разделом mysql ПО ПОЛЯМ. Я думаю, он сделает именно то, что вы хотите.

person Glen Solsberry    schedule 01.12.2010
comment
Это быстрее, чем FIND_IN_SET? Могу поспорить, что это так, поскольку у него нет синтаксиса разбора строк, такого как FIND_IN_SET. Я считаю, что синтаксис: ORDER BY FIELD(id,1,3,2,9,7) - person Ciantic; 16.12.2011

Простой ответ:

Инструментируйте свои данные с помощью другого поля int "ordering", а затем ORDER BY этого поля. Это должно быть все, что необходимо большую часть времени. Я успешно реализовал это, когда клиенты могут добавлять определенные продукты в список избранных и т. д., применяя низкие значения, такие как -1 или -99, в поле заказа.

Сложный ответ:

Это применимо, если вы хотите нормализовать этот порядок, и если, возможно, у вас есть другое поле в качестве второго фактора в порядке, которое уже есть в вашей основной таблице. Это также поможет, если у вас есть другая информация, связанная с каждым пунктом заказа, например примечание. Или, если множество таблиц будут реализовывать этот произвольный порядок, и вы хотите организовать/изменить этот порядок из одного места.

Что вы должны сделать, так это разместить «произвольный» порядок в таблице, к которой вы можете присоединиться, а затем упорядочить по этому полю:

SELECT t.*, o.ordering
FROM table_name AS t
LEFT JOIN table_name_ordering AS o ON t.ordering_id = o.id
ORDER BY o.ordering, t.other_field
person zanlok    schedule 01.12.2010
comment
Я хотел отсортировать по A, P, B, D. Этот ответ помог. - person Timothy B.; 17.10.2020