SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.12.2011 13:57:32

Жека
Участник
Зарегистрирован: 01.12.2011
Сообщений: 4

Сортировка

Здравствуйте.
У меня такая задача. В поле varchar(255) сохранено  вот такой текст "CC9966:29.87|996633:18.01|CC6633:13.11|FF3333:5.88|663300:4.66|993300:3.41|993333:3.30|CC0000:3.00|FFCC99:2.45|CC3333:2.08"

Где
"CC9966" - цвет,
":" - разделитель,
"29.87" - процентов цвета на картинке,
"|" - разделитель и т. д.

Максимум 10 цветов. Может быть и меньше.

LIKE-ком нахожу цвет. Но как отсортировать найденный результат по процентам? Может поможет SUBSTRING_INDEX. Но тогда как потом определить процент нужного цвета.



Помогите написать нужный запрос  или может посоветуйте как по другому решить задачу.
Огромное спасибо!

Неактивен

 

#2 01.12.2011 14:29:15

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Сортировка

По процентам какого цвета? Первого или не первого? Оно-то можно, путём вырезания подстроки, но имхо, лучше эти данные таки разбить и всунуть в отдельную таблицу smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#3 01.12.2011 15:37:02

Жека
Участник
Зарегистрирован: 01.12.2011
Сообщений: 4

Re: Сортировка

По процентам цвета которого ищем. Например нашли лайком "996633" 20 записей. Теперь нужно отсортировать по числам которые возле этого цвета. То есть по числу после цвета между ":" и "|".

Неактивен

 

#4 01.12.2011 16:16:37

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Сортировка

Я не знаю умеет ли мускль определять позицию подстроки в строке. Если умеет - то можно извратиться вырезая эти самые проценты и сортируя по ним, а если нет, то наверное таки придётся разделять данные.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#5 01.12.2011 16:24:46

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка

Neval написал:

Я не знаю умеет ли мускль определять позицию подстроки в строке. Если умеет - то можно извратиться вырезая эти самые проценты и сортируя по ним, а если нет, то наверное таки придётся разделять данные.

Здесь было похожее.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 01.12.2011 17:05:35

Жека
Участник
Зарегистрирован: 01.12.2011
Сообщений: 4

Re: Сортировка

deadka написал:

Neval написал:

Я не знаю умеет ли мускль определять позицию подстроки в строке. Если умеет - то можно извратиться вырезая эти самые проценты и сортируя по ним, а если нет, то наверное таки придётся разделять данные.

Здесь было похожее.

Спосибо. Действительно похоже. Применил для моего случая. работаетsmile НО! только для тех полей в которых цвет идет самый первый. То есть для "996633" который идет вторым. уже процент не определяется sad

Неактивен

 

#7 01.12.2011 17:10:47

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка

Жека, я подозреваю, что можно как-то выкрутится и определить и процент тоже. Но имхо лучше взглянуть на проблему более системно и не пытаться забить гвоздь микроскопом.

1) Такие вещи проще сделать на процедурном языке. И более переносимо и более надёжно. Если так уж ни хочется на клиенте, напишите функцию MySQL, в которой можно и explode и split использовать.

2) А еще лучше последовать рекомендации Neval'а и вынести весь этот жуткий текст в отдельную таблицу, разбив на блоки. Тогда будет гораздо проще.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 01.12.2011 17:23:57

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Сортировка

Жека написал:

только для тех полей в которых цвет идет самый первый

Имея функции нахождения позиции подстроки в строке таки можно выкрутиться и написать соответствующее "обрезание" smile В любом случае эти вычисления необходимо делать в SELECT. Алгоритм примерно следующий:
1. Определяете позицию цвета и обрезаете строку чтобы получилась от этой позиции до конца.
2. В полученной строке определяете позицию символов : и |, и обрезаете строку от позиции : до позиции | (делается путём вычитания | из : ).
3. Получаете в итоге проценты и присваиваете значениению алиас.
4. Сортируете по алиасу процентов.

Или в первом шаге обрезать от найденной позиции +7, если длина значения цвета всегда одинакова, тогда во втором пункте у Вас уже не будет :.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#9 01.12.2011 18:31:08

Жека
Участник
Зарегистрирован: 01.12.2011
Сообщений: 4

Re: Сортировка

Всем огромное спасибо!!!
Полностью разобрался как можно сделать с SUBSTRING(). И сделал как советовал Neval. У меня остался вопрос как будет работать быстрее мой первый подход или разбив на блоки. Получается ели разбивать на блоки для каждой записи 10 полей цветов а записей больше 50 000 и того 500 000 .  Или искать по первому варианту со скромной вставкой:
SUBSTRING(
        s.colors,
        LOCATE('цвет:', s.colors) + 7,
      4
) AS proc

?

Неактивен

 

#10 01.12.2011 18:32:40

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка

Скромная вставка индекс не будет использовать, это не есть гут.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 01.12.2011 18:42:09

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Сортировка

Вроде как поиск по LIKE является самым медленным, а ещё и если в 50к строк, тогда вообще жопа))) по сему лучше уж вынести эти цвета/проценты в отдельную таблицу smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#12 01.12.2011 18:43:54

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка

Топикстартеру стоит реализовать оба способа, сравнить скорость на хорошем количестве данных, тут же создаст отдельную таблицу smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson