Forum Webscript.Ru

Общие => Базы данных => Тема начата: zuko от 26 Февраля 2009, 11:35:48

Название: Хитрая сортировка в запросе
Отправлено: zuko от 26 Февраля 2009, 11:35:48
Необходимо данные, выбранные с помощью SELECT из MySQL, сортировать по определенному полю, указанному в ORDER BY.
Но проблема в том, что сортировать не по ASC и не по DESC, а так сказать, по своему алфавиту: сначала идут данные, которые начинаются на RB, потом RE, далее N и потом M.
Название: Хитрая сортировка в запросе
Отправлено: ravshaniy от 01 Марта 2009, 20:03:29
Свой алфавит имеет 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 от 03 Марта 2009, 16:25:56
ravshaniy
Да при чем здесь это?

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

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

В общем, рекомендую поискать по бд-форуму, тема раза три в год всплывает, может что и подберешь.
Название: Хитрая сортировка в запросе
Отправлено: CGVictor от 03 Марта 2009, 16:32:16
zuko
Хотя вот мне тут подсказывают, что уже и не все так плохо с подстановками.
Т.е. SELECT * FROM col ORDER BY FIELD(col, \'RB\', \'RE\', ..);
Что же касается "начинается на" - т.е. если нужно еще вести выборку внутри группы like - то это, наверно, в сторону группировок по условию, а дальше уже order (by null).
Название: Хитрая сортировка в запросе
Отправлено: ravshaniy от 04 Марта 2009, 00:16:20
ну да точно, только все что вы тут написали уже реализовано в фунции order by. И как бы не дураки писали, тоже понимали что сортировка определяется весом сравниваемых значений. Для этого написали отдельно функцию и отдельно правила сравнения. итак функция есть осталось определить правила - collation. После зарегистрировать collation в таблице и все готово, больше делать ничего не нужно, особенно править селекты. Учтите что вышеперечисленные методы - накладные расходы.

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

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

можно конечно не сортировать во время выборки а использовать уже установленную кемто сортировку. Переодически эту сортировку корректировать джобом  или триггером после инсерт, делейт, апдейт. ну это опять же накладные расходы хотя и не заметные для конечного пользователя.
Название: Хитрая сортировка в запросе
Отправлено: kirillmm от 04 Марта 2009, 07:44:13
Молодец, очень прикольно придумал, уважаю.
Название: Хитрая сортировка в запросе
Отправлено: CGVictor от 05 Марта 2009, 03:24:47
ravshaniy
Все было бы так, как ты говоришь , вот только в over9k прикладных задач вес в выдаче сортировки - величина непостоянная.
Т.е. абзац наступает ровно в тот момент, когда тебе нужно реализовать развесовку _и_ для "RB, потом RE, далее N", _и_ для какого-нибудь N-RB-RE.

В общем, автору и решать.
Название: Хитрая сортировка в запросе
Отправлено: brat02 от 05 Марта 2009, 14:55:56
да это не легко
Название: Хитрая сортировка в запросе
Отправлено: pmarkov от 07 Марта 2009, 22:00:47
Да, точно проблема, серьезная к тому же.
Название: Хитрая сортировка в запросе
Отправлено: zuko от 08 Марта 2009, 14:14:39
Сорри, что не участвовал в дискуссии - я в отпуске. А тут заглянул через недельку... Спасибо за помощь. Решение проблемы я перед отпуском все-таки нашел в инете.

ORDER BY
CASE field
    WHEN \'RBK\' THEN 1
    WHEN \'REK\' THEN 2
    WHEN \'NEK\' THEN 3
    WHEN \'MEK\' THEN 4
    ELSE 9999
END

(значения полей вымышленные, не ломайте голову)

Недостаток этого способа в том, что нужно указывать полные значения, я не кусок или начало. Но это не факт, мне такого варианта было достаточно и дальше я не разбирался.
Название: Хитрая сортировка в запросе
Отправлено: CGVictor от 08 Марта 2009, 22:22:29
[moderatorial] Тема закрыта.