MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую)

MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую) Возникла ситуация, когда в столбце хранится строка из значений через запятую и надо проверить есть ли среди этих значений совпадающее с переменной.

Ситуация усугублена тем, что проверку надо выполнить в запросе, то есть php здесь не получается использовать (типа разбить в массив и в цикле сравнить). Стал копаться в строковых функциях MySQL. Вообще много пишут, что в таких случаях надо создавать таблицу связей и соспоставлять значения. Согласен, но я уже загнал себя в mysql и переделывать пока не хочется.

Среди строковых функций попалась FIND_IN_SET( str string, strlist string )

Возвращает значение от 1 до ..., в зависимости от позиции строки str среди строк (подстрок) в строке strlist. Строки (подстроки) в strlist разделены ",". Возвращает 0, если str не найдена среди строк в strlist. Возвращает NULL, если один из аргументов NULL.

Примеры:

mysql> SELECT FIND_IN_SET('b','a,b,c,d');
        -> 2

Моя проблема возникла когда в столбце хранилось, например, '123, 234, 1198, 2843', 

вот такого условия хватало

$criteria->addCondition('album_id LIKE :keyword', 'AND');
$criteria->params += array(':keyword'=>'%'.strtr($albumId,array('%'=>'\%', '_'=>'\_', '\\'=>'\\\\')).'%'); 

пока переменная $albumId не равно 198. Тогда обычного LIKE не хватает, то есть он выбирает не только 1198 но и 198, что не должно быть.

Проблему решило (пока) добавление условия

$criteria->addCondition('find_in_set('.$albumId.', replace(trim(album_id)," ","")) !=0', 'AND'); // find_in_set работает только со строкой без пробелов.

Здесь потребовалась убирать пробелы с помощью replace внутри строки (между запятыми). 

Так я добился того, чего хотел. Как насчёт нагрузки на сервер баз данных - ответить не могу. Думаю не очень хорошо такое решение, но оно работает!

Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (0)     Подпишитесь на RSS комментариев к этой статье.