Поиск по значению, разделенному запятыми

Это один из тех моментов «мой бог».

Предыдущий программист в нашей компании оставил плохо кодированное приложение с использованием PHP и MySQL.

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

Чтобы настроить систему в течение шести месяцев, я ищу способ выполнить поиск по этим значениям, разделяющим запятую. Кто-нибудь получил представление о поиске такого CSV без значительного влияния на производительность? Я знаю, что это не будет лучшим, но, по крайней мере, я могу заставить приложение пойти еще на шесть месяцев до того, как новое приложение будет готово.

Спасибо за любую помощь

Как создать таблицу, которая правильно разбивает столбец CSV на несколько столбцов (или несколько записей) один раз в виде пакетного процесса, а затем собирает триггер обновления в старой таблице для обновления записи (или записей) для этого пользователя? Затем вы могли бы писать приличные запросы по нему, не переделывая логику setter.

Вы можете использовать FIND_IN_SET для извлечения строк, соответствующих вашим критериям:

 SELECT * FROM your_table WHERE FIND_IN_SET('value', field_with_comma_sep_values) > 0; 

В принципе, FIND_IN_SET возвращает индекс найденного элемента. Таким образом, этот запрос находит все строки, где находит совпадающее слово в «наборе» значений, разделенных запятыми.

Кредит: я знал, что есть что-то вроде этого, но этот пост – это то, где я нашел ответ и инструкцию SELECT.

 $a = '123,456,789'; $a_array = explode(",",trim($a)); if(in_array('456',$a_array)) { echo 'exist'; } else echo 'not exist'; 

Вот одна идея для его обработки без изменения схемы или представления:

 <?php function checkoption ($user, $option) { global $db; $rs = mysql_query ("select option_field_name from customer where user = '$user'", $db); if ($rs) { // enclose result in commas to remove edge cases for next test $opts = ",," . $rs ['option_field_name'] . ","; return strpos ($opts, ",$option,") != false; } return false; } ?> 

Он ищет ,option, в поле для пользователя, и защищает от крайних случаев, обрабатывая все ссылки с дополнительной парой окружающих запятых. Чтобы избежать проблемы с нулем и нулем, добавляется дополнительная запятая к фронту строки db.

Итак, вы говорите, что хотите получить запрос, который возвращает все строки, где пользователь имеет конкретную опцию?

Ну, тьфу … ладно, это некрасиво, но вы уже это знаете, так:

 select * from user_table where concat(',',option_field,',') like "%,option_you_want,%" 

Я не могу говорить о влиянии производительности – это, вероятно, не нравится, но я думаю, что ваш другой вариант – вывести строку в отдельную таблицу, но вы говорите, что это нереально.