разбить значения поля по символу

 
0
 
MySQL
ava
zeltek | 27.03.2013, 16:52
Люди, помогите!

Значение в поле s.field_see_value примерно такого содержания - 296;689;211;740;135;140;744;64;311;416
Мне нужно проверить наличие любого из этих значений (296 или 211 или 64 или т.д.) с другим списком (см. внутр. селект - SELECT DISTINCT field_see_value....)
Есть ли возможность разбить значение поля s.field_see_value по спецсимволу ";", чтоб найти любое значение этого поля со списком, который выбирается?

Или быть может имеется другой способ написания выборки?


SELECT DISTINCT title, vid
                            FROM node a, taxonomy_index c, field_data_field_vip d, field_data_field_see s
                            WHERE a.vid = c.nid
                            AND a.vid = d.entity_id
                            AND c.tid = s.entity_id
                            AND s.field_see_value
                            IN (
                                SELECT DISTINCT field_see_value
                                FROM field_data_field_see s, node a, field_data_field_words b, taxonomy_index c
                                WHERE a.vid = c.nid
                                AND c.tid = b.entity_id
                                AND c.tid = s.entity_id
                                AND b.field_words_value LIKE  '%ПР%'
                                OR a.title LIKE  '%ПР%'
                                )
                            ORDER BY d.field_vip_value DESC , a.title ASC
Comments (6)
ava
Akina | 27.03.2013, 17:06 #
Если имеется строковый список (list='296;689;211;740;135;140;744;64;311;416'), и надо проверить наличие в нём определённого значения (value='296'), то можно это сделать несколькими способами.

Самый простой для понимания:


WHERE INSTR(CONCAT(';',list,';'),CONCAT(';',value,';'))>0

ava
zeltek | 27.03.2013, 17:21 #
я так понял это подойдет к поиску одного значения (value='296') в списке (list='296;689;211;740;135;140;744;64;311;416')
но,дело в том что у меня нужно проверить есть ли любое значение (value='296;64;555') из поля s.field_see_value в списке  (list='296,689,211,740,135,140,744,64,311,416') (формируется по внутр.селекту) , т.е. если либо 296 либо 64 либо 555 из значения поля s.field_see_value находится в списке list
ava
Akina | 27.03.2013, 22:13 #
MySQL - реляционная БД.
Ваш подход ничего общего с реляционным не имеет. Похоже, опыт процедурного программирования есть, а SQL-ного - нет, именно это и мешает.
Переделывайте мышление. А потом - логику приложения и структуры БД.
ava
skyboy | 27.03.2013, 23:19 #
1. решение простое, медленное и громоздкое: при формировании запроса разбить маленький список для поиска на отдельные условия:
Цитата (zeltek @  27.3.2013,  16:21 findReferencedText)
(value='296;64;555'

становится 

INSTR(CONCAT(';',296,';'),CONCAT(';',value,';'))>0 OR INSTR(CONCAT(';',64,';'),CONCAT(';',value,';'))>0 OR INSTR(CONCAT(';',555,';'),CONCAT(';',value,';'))>0

медленное решение по двум причинам: строковые операции на значении нефиксированной длины и невозможность использовать индексы.
2. решение, о котором говорил Akina: изменить структуру БД, чтоб у тебя было один-ко-многим и эти самые value хранились не в виде одного значения с сериализированным списком, а в отдельной таблице на каждое число отводилась отдельная запись.
впрочем, список значений для поиска все равно придется разбивать при формировании запроса:

table2.value = 296 OR table2.value = 64 OR table2.value = 555


советую применять решение 1 только в том случае, если пример учебный и сдать надо быстро, а показывать "правильность" опасно — ну, вопросами там ненужными грузить начнут  smile 
а так — преимущества второго варианта как в скорости, так и в гибкости. 
ava
zeltek | 28.03.2013, 09:51 #
То что не правильная структура БД - согласен. К сожалению показанный пример от skyboy не совсем подходит, т.к. значения table2.value = 296 OR table2.value = 64 OR table2.value = 555, которые мы будем искать в списке, могут быть разными и их кол-во также ....
Придется вносить изменения в структуру БД....
ava
skyboy | 28.03.2013, 13:07 #
Цитата (zeltek @  28.3.2013,  08:51 findReferencedText)
могут быть разными и их кол-во также

так я ж писал. ты запрос как формируешь?
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Akina   skyboy   zeltek
advanced
Submit