CI & MySQL;используя LIKE на строке с разделителями - PullRequest
0 голосов
/ 30 августа 2011

Может быть, LIKE - неправильное решение для того, что я пытаюсь сделать; но я стремлюсь получить строку, извлеченную из базы данных. (т. е. теги [tag1, tag2, tag3, tag4]) - затем сравните каждое значение (разделенное запятой) и верните соответственно строки.

<?
$string = 'tag1,tag2,tag3,tag4';
$tags = explode(',', $string);
foreach ( $tags as $tag )
{
    $this->db->limit(2); $this->db->like('Tags', $tag);
    $result = $this->db->get('table');
    $recommend[] = $result;
}

Это лучшее, что я мог понять, как сделать то, что я ищу, но я совершенно запутался в методе LIKE в целом в классе Active Record CI.

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


Спасибо за вклад и идеи, которые вы двое. MySQL идет мне на ум, но после прочтения о возможностях реляционных баз данных; Я попытаюсь изучить этот процесс, чтобы повысить эффективность своей базы данных.

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

Опять же, спасибо за информацию и идеи.

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Если у вас есть правильно нормализованная база данных, теги должны быть разделены на новую таблицу, так как это отношение один ко многим (или, может быть, даже ко многим).

Однако самый простой способ добиться этого - также поставить запятую перед первым и последним тегом и просто найти:

SELECT * FROM table WHERE Tags LIKE "%, coleslaw,% ";

Но да, это плохо, и может быть медленным, если ваша таблица растет, так как вы не сможете использовать индексы.

1 голос
/ 30 августа 2011

В MySQL есть команда FIELD, которой вы можете воспользоваться.Вы можете прочитать об этом здесь .

Но в целом выполнение поиска строк с разделителями или вообще подстрок в базе данных снизит производительность, поскольку вы потеряете любую индексацию при сопоставлении наподстрока.Если у вас есть тысяча строк, MySQL должен будет просмотреть все тысячи строк, прежде чем обнаружит, что нет совпадений.Это относится как к Like, так и к Substring, указанным в предложении where.Многие реализации баз данных специально предоставляют оператор BEGINS WITH, который все еще может использовать преимущества индексирования, но я не знаю об этом в MySQL.

Рассмотрим вместо этого разбивание строки во время вставки и сохранение каждого слова отдельнодругой стол.Если вы обнаружите, что делаете это часто, рассмотрите механизм, созданный для поиска текста, например Lucene .Вы можете использовать PHP с Lucene через SOLR .Хотя я добавлю это, это вполне может быть излишним для вашего проекта.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...