Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
У меня такая задача. В поле 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. Но тогда как потом определить процент нужного цвета.
Помогите написать нужный запрос или может посоветуйте как по другому решить задачу.
Огромное спасибо!
Неактивен
По процентам какого цвета? Первого или не первого? Оно-то можно, путём вырезания подстроки, но имхо, лучше эти данные таки разбить и всунуть в отдельную таблицу
Неактивен
По процентам цвета которого ищем. Например нашли лайком "996633" 20 записей. Теперь нужно отсортировать по числам которые возле этого цвета. То есть по числу после цвета между ":" и "|".
Неактивен
Я не знаю умеет ли мускль определять позицию подстроки в строке. Если умеет - то можно извратиться вырезая эти самые проценты и сортируя по ним, а если нет, то наверное таки придётся разделять данные.
Неактивен
Neval написал:
Я не знаю умеет ли мускль определять позицию подстроки в строке. Если умеет - то можно извратиться вырезая эти самые проценты и сортируя по ним, а если нет, то наверное таки придётся разделять данные.
Здесь было похожее.
Неактивен
deadka написал:
Neval написал:
Я не знаю умеет ли мускль определять позицию подстроки в строке. Если умеет - то можно извратиться вырезая эти самые проценты и сортируя по ним, а если нет, то наверное таки придётся разделять данные.
Здесь было похожее.
Спосибо. Действительно похоже. Применил для моего случая. работает НО! только для тех полей в которых цвет идет самый первый. То есть для "996633" который идет вторым. уже процент не определяется
Неактивен
Жека, я подозреваю, что можно как-то выкрутится и определить и процент тоже. Но имхо лучше взглянуть на проблему более системно и не пытаться забить гвоздь микроскопом.
1) Такие вещи проще сделать на процедурном языке. И более переносимо и более надёжно. Если так уж ни хочется на клиенте, напишите функцию MySQL, в которой можно и explode и split использовать.
2) А еще лучше последовать рекомендации Neval'а и вынести весь этот жуткий текст в отдельную таблицу, разбив на блоки. Тогда будет гораздо проще.
Неактивен
Жека написал:
только для тех полей в которых цвет идет самый первый
Имея функции нахождения позиции подстроки в строке таки можно выкрутиться и написать соответствующее "обрезание" В любом случае эти вычисления необходимо делать в SELECT. Алгоритм примерно следующий:
1. Определяете позицию цвета и обрезаете строку чтобы получилась от этой позиции до конца.
2. В полученной строке определяете позицию символов : и |, и обрезаете строку от позиции : до позиции | (делается путём вычитания | из : ).
3. Получаете в итоге проценты и присваиваете значениению алиас.
4. Сортируете по алиасу процентов.
Или в первом шаге обрезать от найденной позиции +7, если длина значения цвета всегда одинакова, тогда во втором пункте у Вас уже не будет :.
Неактивен
Всем огромное спасибо!!!
Полностью разобрался как можно сделать с SUBSTRING(). И сделал как советовал Neval. У меня остался вопрос как будет работать быстрее мой первый подход или разбив на блоки. Получается ели разбивать на блоки для каждой записи 10 полей цветов а записей больше 50 000 и того 500 000 . Или искать по первому варианту со скромной вставкой:
SUBSTRING(
s.colors,
LOCATE('цвет:', s.colors) + 7,
4
) AS proc
?
Неактивен
Скромная вставка индекс не будет использовать, это не есть гут.
Неактивен
Вроде как поиск по LIKE является самым медленным, а ещё и если в 50к строк, тогда вообще жопа))) по сему лучше уж вынести эти цвета/проценты в отдельную таблицу
Неактивен
Топикстартеру стоит реализовать оба способа, сравнить скорость на хорошем количестве данных, тут же создаст отдельную таблицу .
Неактивен