2016-03-08 4 views
3

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

enter image description here

и простой запрос для поиска и отображения некоторых результатов из БД:

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

Некоторые обновления:

  1. как указал @Frayne Konok, у меня есть запрос в lowcase и все значения в дБ в lowcase, а также , поэтому дело не может быть проблемой
  2. Как предложил @mkaatman, я обернул столбец keyword вокруг обратных выходов (`)
  3. Я изменил мой вопрос, так что теперь он выглядит как один из них предложил @ 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?

На данный момент я готов изменить структуру и код, если это поможет.

Благодаря

+0

ли эту работу ? 'SELECT FIND_IN_SET ('Twitter', 'Google, Facebook, Twitter'); 'Я бы' var_dump ($ q); 'прямо внутри foreach, чтобы убедиться, что вы проверяете, что, по-вашему, проверяете. Кроме того, я не считаю, что ключевые слова должны быть окружены кавычками. – mkaatman

+0

В этом случае проблема может быть проблемой, вы можете попробовать 'LOWER' в своем' описании'. ex: 'LOWER (описание), например '% $ q%''. также 'strtolower'' $ q' –

+0

@mkaatman без ключевых слов в кавычках У меня есть синтаксическая ошибка, говорящая «неизвестные ключевые слова столбца в таблице» – Nick

ответ

0

Я закончил с использованием этой структуры и запрос здесь:

$q = $_REQUEST['search']; 
$q_comma = array_filter(explode(' ', str_replace(',', ' ', $q))); 
$count = count($q_comma); 
$dbQuery = "select id, link, description, tags from db where "; 
$searchTerms = ''; 

foreach ($q_comma as $q) { 
    $counter++; 
    if ($counter == 1) { 
     $searchTerms .= "tags LIKE '%$q%'"; 
    } else { 
     $searchTerms .= "and tags LIKE '%$q%'"; 
    } 
} 


$sql_res = $dbQuery . $searchTerms; 
$result = mysqli_query($db, $sql_res) or die(mysqli_error($db)); 
$return_arr = array(); 
$data = array(); 
if (mysqli_num_rows($result) == 0) { 
    echo "Nothing"; 
} else { 
    while ($row = mysqli_fetch_object($result)) { 
     $data[] = $row; 
    } 
    mysqli_free_result($result); 
    echo json_encode($data); 
} 
0

Это может помочь вам

$sql_res = "select link, description, keyword from myDB 
     where (FIND_IN_SET('yahoo',keyword) or 
      FIND_IN_SET('twitter',keyword)) or 
      description like '%$q%'"; 

Вы используете AND условие в FIND_IN_SET

+0

С вашим примером на самом деле не швы для фильтрации, поскольку мне нужно ... если я набираю google, facebook, он отображает все правильные строки, но если я добавляю, например, твиттер, он все еще показывает все строки, даже если у меня только 1 со всеми тремя ключевыми словами togheter – Nick

Смежные вопросы