Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разбить значения поля по символу 
:(
    Опции темы
zeltek
Дата 27.3.2013, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 10.1.2007
Где: Геническ (Украина )

Репутация: нет
Всего: нет



Люди, помогите!

Значение в поле 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

PM MAIL   Вверх
Akina
Дата 27.3.2013, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Если имеется строковый список (list='296;689;211;740;135;140;744;64;311;416'), и надо проверить наличие в нём определённого значения (value='296'), то можно это сделать несколькими способами.

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

Код

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




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
zeltek
Дата 27.3.2013, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 10.1.2007
Где: Геническ (Украина )

Репутация: нет
Всего: нет



я так понял это подойдет к поиску одного значения (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
PM MAIL   Вверх
Akina
Дата 27.3.2013, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



MySQL - реляционная БД.
Ваш подход ничего общего с реляционным не имеет. Похоже, опыт процедурного программирования есть, а SQL-ного - нет, именно это и мешает.
Переделывайте мышление. А потом - логику приложения и структуры БД.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
skyboy
Дата 27.3.2013, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



1. решение простое, медленное и громоздкое: при формировании запроса разбить маленький список для поиска на отдельные условия:
Цитата(zeltek @  27.3.2013,  16:21 Найти цитируемый пост)
(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 
а так — преимущества второго варианта как в скорости, так и в гибкости. 
PM MAIL   Вверх
zeltek
Дата 28.3.2013, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 10.1.2007
Где: Геническ (Украина )

Репутация: нет
Всего: нет



То что не правильная структура БД - согласен. К сожалению показанный пример от skyboy не совсем подходит, т.к. значения table2.value = 296 OR table2.value = 64 OR table2.value = 555, которые мы будем искать в списке, могут быть разными и их кол-во также ....
Придется вносить изменения в структуру БД....
PM MAIL   Вверх
skyboy
Дата 28.3.2013, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(zeltek @  28.3.2013,  08:51 Найти цитируемый пост)
могут быть разными и их кол-во также

так я ж писал. ты запрос как формируешь?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.