Автор Тема: Хитрая сортировка в запросе  (Прочитано 12057 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн zuko

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 23
  • +0/-0
  • 0
    • Просмотр профиля
Хитрая сортировка в запросе
« : 26 Февраля 2009, 11:35:48 »
Необходимо данные, выбранные с помощью SELECT из MySQL, сортировать по определенному полю, указанному в ORDER BY.
Но проблема в том, что сортировать не по ASC и не по DESC, а так сказать, по своему алфавиту: сначала идут данные, которые начинаются на RB, потом RE, далее N и потом M.

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Хитрая сортировка в запросе
« Ответ #1 : 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

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Хитрая сортировка в запросе
« Ответ #2 : 03 Марта 2009, 16:25:56 »
ravshaniy
Да при чем здесь это?

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

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

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

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Хитрая сортировка в запросе
« Ответ #3 : 03 Марта 2009, 16:32:16 »
zuko
Хотя вот мне тут подсказывают, что уже и не все так плохо с подстановками.
Т.е. SELECT * FROM col ORDER BY FIELD(col, \'RB\', \'RE\', ..);
Что же касается "начинается на" - т.е. если нужно еще вести выборку внутри группы like - то это, наверно, в сторону группировок по условию, а дальше уже order (by null).
LJ: Backslashed life (rss)

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Хитрая сортировка в запросе
« Ответ #4 : 04 Марта 2009, 00:16:20 »
ну да точно, только все что вы тут написали уже реализовано в фунции order by. И как бы не дураки писали, тоже понимали что сортировка определяется весом сравниваемых значений. Для этого написали отдельно функцию и отдельно правила сравнения. итак функция есть осталось определить правила - collation. После зарегистрировать collation в таблице и все готово, больше делать ничего не нужно, особенно править селекты. Учтите что вышеперечисленные методы - накладные расходы.

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

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

можно конечно не сортировать во время выборки а использовать уже установленную кемто сортировку. Переодически эту сортировку корректировать джобом  или триггером после инсерт, делейт, апдейт. ну это опять же накладные расходы хотя и не заметные для конечного пользователя.
« Последнее редактирование: 04 Марта 2009, 00:31:30 от ravshaniy »
убили кенни, сволочи

Оффлайн kirillmm

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 1
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.roseclub.ru/
Хитрая сортировка в запросе
« Ответ #5 : 04 Марта 2009, 07:44:13 »
Молодец, очень прикольно придумал, уважаю.

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Хитрая сортировка в запросе
« Ответ #6 : 05 Марта 2009, 03:24:47 »
ravshaniy
Все было бы так, как ты говоришь , вот только в over9k прикладных задач вес в выдаче сортировки - величина непостоянная.
Т.е. абзац наступает ровно в тот момент, когда тебе нужно реализовать развесовку _и_ для "RB, потом RE, далее N", _и_ для какого-нибудь N-RB-RE.

В общем, автору и решать.
LJ: Backslashed life (rss)

Оффлайн brat02

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 1
  • +0/-0
  • 0
    • Просмотр профиля
    • http://rusman.co.uk
Хитрая сортировка в запросе
« Ответ #7 : 05 Марта 2009, 14:55:56 »
да это не легко

Оффлайн pmarkov

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 1
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.silc.ru/
Хитрая сортировка в запросе
« Ответ #8 : 07 Марта 2009, 22:00:47 »
Да, точно проблема, серьезная к тому же.

Оффлайн zuko

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 23
  • +0/-0
  • 0
    • Просмотр профиля
Хитрая сортировка в запросе
« Ответ #9 : 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

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Хитрая сортировка в запросе
« Ответ #10 : 08 Марта 2009, 22:22:29 »
[moderatorial] Тема закрыта.
LJ: Backslashed life (rss)

 

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