Общие > Базы данных

Хитрая сортировка в запросе

(1/3) > >>

zuko:
Необходимо данные, выбранные с помощью SELECT из MySQL, сортировать по определенному полю, указанному в ORDER BY.
Но проблема в том, что сортировать не по ASC и не по DESC, а так сказать, по своему алфавиту: сначала идут данные, которые начинаются на RB, потом RE, далее N и потом M.

ravshaniy:
Свой алфавит имеет collation?


--- Цитировать ---5.11.5. String Collating Support
If the sorting rules for your language are too complex to be handled with the simple sort_order[] table, you need to use the string collating functions.

The best documentation for this is the existing character sets. Look at the big5, czech, gbk, sjis, and tis160 character sets for examples.

You must specify the strxfrm_multiply_MYSET=N value in the special comment at the top of the file. N should be set to the maximum ratio the strings may grow during my_strxfrm_MYSET (it must be a positive integer).

--- Конец цитаты ---

CGVictor:
ravshaniy
Да при чем здесь это?

zuko
Есть способы типа
SELECT * FROM table WHERE col ORDER BY FIND_IN_SET( col, \'..\' ) ,
но они кривые и страшные как моя жизнь.

Вторая большая куча решений - это выделить порядок сортировки в отдельную таблицу и сортировать запрос по уже двум. Массивный плюс в том, что нормально используются индексы.

В общем, рекомендую поискать по бд-форуму, тема раза три в год всплывает, может что и подберешь.

CGVictor:
zuko
Хотя вот мне тут подсказывают, что уже и не все так плохо с подстановками.
Т.е. SELECT * FROM col ORDER BY FIELD(col, \'RB\', \'RE\', ..);
Что же касается "начинается на" - т.е. если нужно еще вести выборку внутри группы like - то это, наверно, в сторону группировок по условию, а дальше уже order (by null).

ravshaniy:
ну да точно, только все что вы тут написали уже реализовано в фунции order by. И как бы не дураки писали, тоже понимали что сортировка определяется весом сравниваемых значений. Для этого написали отдельно функцию и отдельно правила сравнения. итак функция есть осталось определить правила - collation. После зарегистрировать collation в таблице и все готово, больше делать ничего не нужно, особенно править селекты. Учтите что вышеперечисленные методы - накладные расходы.

Примечание по накладным расходам.
Считайте сами, для каждой строчки выборки перед order by будет выполняться функция FIELD(col, \'RB\', \'RE\', ..).

я не думаю, что можно хранить индекс по результату функции или по функции.

можно конечно не сортировать во время выборки а использовать уже установленную кемто сортировку. Переодически эту сортировку корректировать джобом  или триггером после инсерт, делейт, апдейт. ну это опять же накладные расходы хотя и не заметные для конечного пользователя.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии