Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Вопрос по сортировки


Автор: MaxB 20.5.2008, 16:06
Привет всем!

Есть ли возможность заставить оператор 
Код

select * from xxx order name
 сортировать сначала кирилицу, а потом только латиницу. Т.е. сначало чтоб шли А-Я, а потом только A-Z  и цифры.
Если нет. То как это оптимальнее реализовать.

Заранее благодарен.

Автор: bars80080 20.5.2008, 18:12
по-моему, такие спец порядки только на программном языке, с которого запрос идёт, имхо

Автор: Magnifico 20.5.2008, 19:13
Прикладная задача у тебя есть строковое поле с Первыми буквами англиского, Русского и  цифры

Код

create temporary table test
(
id int not null AUTO_INCREMENT,
name varchar(10),
PRIMARY KEY (id)
)
insert into test

select 1,'A'  union all
select 2,'B'  union all
select 3,'C'  union all
select 4,'D'  union all
select 5,'E'  union all
select 6,'1'  union all
select 7,'2'  union all
select 8,'3'  union all
select 9,'4'  union all
select 10,'5'  union all
select 11,'А'  union all
select 12,'Б'  union all
select 13,'В'  union all
select 14,'Г'  union all
select 15,'Д'  


Код

select * from test 
order by 
# русский алфавит 33 буквы
case when name like  'А%'  then 1
        when name like  'Б%'  then 2 
        when name like  'В%'  then 3 
        when name like  'Г%'  then 4
       when name like  'Д%'  then 5
# и так далее до 33

# английски алфавит  26 букв
        when name like  'A%'  then 34
        when name like  'B%'  then 35 
        when name like  'C%'  then 36
        when name like  'D%'  then 37 
        when name like  'E%'  then 38 
# и так далее до 60

# цифры всего 10   от 0 до 9
    when name like  '0%'  then 61
            when name like  '1%'  then 62 
            when name like  '2%'  then 63
    when name like  '3%'  then 64 
    when name like  '4%'  then 65
    when name like  '5%'  then 66
    when name like  '6%'  then 67
end



и конечно делаешь из этого фукцию с полным алфавитом и соответсвием цифр
и применяешь в   order by  фунМояСортировка(name)

Автор: Feldmarschall 20.5.2008, 20:34
Magnifico, думаю, такое решение представляет исключительно академический интерес, и не имеет никакой связи с реальностью.
А для реальной работы - делать свой collation set. Вот только врядли автор обладает такими правами в настройке БД.

Автор: MaxB 21.5.2008, 11:11
Magnifico, спасибо.  smile 
Но по моему мнению Feldmarschall, прав. При каждом запросе страници так сортировать, мне не какого хостинга не хватит, а если ето не буквы а целые слова. 
Я полагаю, что необходимо ввести еще одно поле "order", потом запросом
Код

set @c:=0;
UPDATE jos_mb_video 
SET `order`=(SELECT @c:=@c+1) 
WHERE LEFT(jos_mb_video.name_video_rus,1) REGEXP '^([А-Я]|[а-я])' ORDER BY `name_video_rus`;
UPDATE jos_mb_video 
SET `order`=(SELECT @c:=@c+1) 
WHERE LEFT(jos_mb_video.name_video_rus,1) REGEXP '^([A-Z]|[a-z])' ORDER BY `name_video_rus`;
UPDATE jos_mb_video 
SET `order`=(SELECT @c:=@c+1) 
WHERE LEFT(jos_mb_video.name_video_rus,1) REGEXP '^([0-9])' ORDER BY `name_video_rus`;

заполнить его.
При каждом запросе страницы сортировать по полю `order`, а его сделать как индекс.
Может есть еще способы. Feldmarschall,  можно по потробней про collation set.




Автор: Akina 21.5.2008, 11:50
Цитата(MaxB @  21.5.2008,  12:11 Найти цитируемый пост)
можно по потробней про collation set

http://dev.mysql.com/doc/mysql/search.php?version=5.0&q=collation+set&from=%2Fdoc%2Frefman%2F5.0%2Fen%2Findex.html&lang=en

Автор: Feldmarschall 21.5.2008, 12:10
порядок сортировки хранится в XML файле
насколько я понимаю, его вполне можно подправить ручками так, как хочется.
но, разумеется, только имея административный доступ к серверу

Автор: MaxB 21.5.2008, 12:38
Спасибо, буду разбираться. smile 

Автор: bars80080 21.5.2008, 16:02
оффтоп наверно

интересно, однажды у меня был факт, что при довольно большом числе выборок всплыла такая проблема, что сопоставляя значения с русскими символами ( where field='аб' ), запросы довольно сильно тормозили. тогда я ввёл дополнительное поле с тем же словом, но url-кодированное. скорость резко повысилась и стал искать по нему.


мож у меня просто БД старая...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)