2010-01-01 4 views
1

Это один из тех моментов «О мой бог».Поиск из значения, разделенного запятой

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

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

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

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

+2

Система может быть или не быть плохо кодирована, но это совершенно не относится к ее ООП. Хороший код не обязательно влечет за собой ООП, и ООП обязательно не влечет за собой хороший код. – cletus

+0

Я согласен с вашей точкой. Но я не особо указываю на ООП за его плохую структуру. Конечно, я видел много хороших кодов, которые были структурированы до PHP 5. Но дело не в том, что у меня в руках.Я бы по крайней мере ожидал функции, которые обрабатывают запросы к базе данных. И не набор запросов в каждой точке программы, где они необходимы. – Nirmal

ответ

2

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

+0

Это отличная идея! Это даже облегчает жизнь для написания кодов _temporary_ и по-прежнему сохраняет атомарность в новой таблице. – Nirmal

0

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

<?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.

0

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

Ну, тьфу ... ладно, это не очень, но вы уже знаете, что, таким образом:

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

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

4

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

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

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

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

+0

Спасибо! Я попробовал 'WHERE 'val' IN (csv_field)', но он возвращает только записи с одним значением (не знаю почему). FIND_IN_SET отлично работает для меня, и это очень быстро в таблице с 20k строк :) – Peter

1
$a = '123,456,789'; 
$a_array = explode(",",trim($a)); 
if(in_array('456',$a_array)) 
{ 
    echo 'exist'; 
} else echo 'not exist'; 
Смежные вопросы