Мне не удалось найти что-нибудь, что действительно помогло мне в этом. У меня есть база данных со следующей структурой:mySql - поисковый запрос на основе ключевых слов
и простой запрос для поиска и отображения некоторых результатов из БД:
if ($_REQUEST['search']) {
$q = $_REQUEST['search'];
$q_comma = explode(", ", $q);
$where_in_set = '';
$count = count($q_comma);
foreach ($q_comma as $q) {
$counter++;
if ($counter == $count) {
$where_in_set .= "FIND_IN_SET('$q','keywords')";
} else {
$where_in_set .= "FIND_IN_SET('$q','keywords') AND ";
}
}
$sql_res = "select link, description, keyword from myDB where $where_in_set or description like '%$q%'";
Этот код работает, но не на самом деле, как я хотел ,
В столбце ключевых слов у меня есть разные ключевые слова, разделенные запятой, и я бы хотел, чтобы их можно было искать, даже если порядок отличается.
Вот пример: Допустим, у меня есть в моем ключевое слово колонке
Google, Facebook, Twitter
С моим текущим кодом, если я типа Google, я могу увидеть результат, но если Я печатаю твиттер, я этого не вижу.
Есть ли что-нибудь, что я могу сделать, чтобы оно работало без учета порядка ключевых слов, но с довольно быстрым поиском?
Любая помощь будет действительно оценена.
PS. Я хотел бы оставить только одну БД, если это возможно, потому что я читал о создании новой таблицы с единственным идентификатором и ключевыми словами, а в моем поиске присоединяются таблицы к идентификаторам, но я предпочел бы лучшее решение, если это возможно.
Благодаря
EDIT
Некоторые обновления:
- как указал @Frayne Konok, у меня есть запрос в lowcase и все значения в дБ в lowcase, а также , поэтому дело не может быть проблемой
- Как предложил @mkaatman, я обернул столбец
keyword
вокруг обратных выходов (`) - Я изменил мой вопрос, так что теперь он выглядит как один из них предложил @ user2272989 в ответ
Так что мой запрос теперь выглядит следующим образом:
select link, description, keyword from myDB
where (FIND_IN_SET('google',`keyword`) or
FIND_IN_SET('facebook', `keyword`) or
FIND_IN_SET('twitter', `keyword`))
OR description like 'google, facebook, twitter'
И это возвращает значения, даже если порядок отличается, но он не показывает только тот, который я хочу. Например, если я пишу Twitter, Google, facebook, у меня есть как вернуть что-то вроде 28 строк, в которых только 2 имеют все три слова в качестве ключевого слова, в то время как мои другие имеют только один или два
EDIT 2 - Обновления
Я просто хочу «повторно открыть» этот вопрос, так как мне не удалось это решить. Если я изменю все ключевые слова в объекте, тогда будет лучше использовать их в качестве ключевых слов? или что является лучшим и надежным способом поиска базы данных по ключевым словам?Имеете разные БД и используете INNER JOIN?
На данный момент я готов изменить структуру и код, если это поможет.
Благодаря
ли эту работу ? 'SELECT FIND_IN_SET ('Twitter', 'Google, Facebook, Twitter'); 'Я бы' var_dump ($ q); 'прямо внутри foreach, чтобы убедиться, что вы проверяете, что, по-вашему, проверяете. Кроме того, я не считаю, что ключевые слова должны быть окружены кавычками. – mkaatman
В этом случае проблема может быть проблемой, вы можете попробовать 'LOWER' в своем' описании'. ex: 'LOWER (описание), например '% $ q%''. также 'strtolower'' $ q' –
@mkaatman без ключевых слов в кавычках У меня есть синтаксическая ошибка, говорящая «неизвестные ключевые слова столбца в таблице» – Nick