2014-10-21 4 views
0

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

Если я не размещаю место и не ищу, он возвращает все результаты независимо от местоположения, и это нормально. Если я помещен в место, которое не существует, и некоторые ключевые слова, он возвращает все результаты, соответствующие ключевым словам, и, кажется, игнорирует местоположение.

Также, если я оставлю ключевые слова пустыми и поиска по месту, которое существует, кажется, что он снова игнорирует местоположение и возвращает все результаты.

Таким образом, казалось бы, моя логика настройки местоположения не работает.

$keys = explode(" ",$tag); 

    $search_sql = "SELECT DISTINCT providers.* FROM providers JOIN provider_tags ON providers.id = provider_tags.provider_Id JOIN tags ON provider_tags.tag_id = tags.id WHERE tags.tag_name LIKE '%$tag%' OR providers.provider_name LIKE '%$tag%' OR providers.provider_contact_name LIKE '%$tag%' OR providers.provider_features LIKE '%$tag%' "; 

    foreach($keys as $k){ 
     $search_sql .= " OR tags.tag_name LIKE '%$k%' OR providers.provider_name LIKE '%$k%' OR providers.provider_contact_name LIKE '%$k%' OR providers.provider_features LIKE '%$k%' "; 
    } 

    $search_sql .= " AND (providers.provider_town LIKE '%{$location}%' OR providers.provider_local_area LIKE '%{$location}%' OR providers.provider_postcode LIKE '%{$location}%')"; 

    echo $search_sql; 
    $gettags = mysqli_query($con, $search_sql) or die(mysqli_error($con)); 
+0

В касательной к этому вопросу, я настоятельно рекомендую вам взглянуть на естественный язык запросов, так как это, вероятно, гораздо лучшее решение, что вы делаете. Читайте об этом здесь: http://dev.mysql.com/doc/refman/5.6/en/fulltext-natural-language.html –

ответ

3

Вы добавляете кучу OR условий в цикле, а затем большой AND состояние расположения. Условие AND проверяется с последним OR цикла. Если какой-либо из других OR при условии, что это true, тогда вы получите результат, не имеющий значения AND.

Edit:

Вы, вероятно, получите результаты, которые вы хотите, если вы:

  • компресс каждые OR условия с скобкой;
  • упаковка всеOR условия вместе.

Что-то вроде:

$search_sql = "SELECT DISTINCT providers.* FROM providers JOIN provider_tags ON providers.id = provider_tags.provider_Id JOIN tags ON provider_tags.tag_id = tags.id WHERE ((tags.tag_name LIKE '%$tag%' OR providers.provider_name LIKE '%$tag%' OR providers.provider_contact_name LIKE '%$tag%' OR providers.provider_features LIKE '%$tag%') "; 

foreach($keys as $k){ 
    $search_sql .= " OR (tags.tag_name LIKE '%$k%' OR providers.provider_name LIKE '%$k%' OR providers.provider_contact_name LIKE '%$k%' OR providers.provider_features LIKE '%$k%') "; 
} 

$search_sql .= ") AND (providers.provider_town LIKE '%{$location}%' OR providers.provider_local_area LIKE '%{$location}%' OR providers.provider_postcode LIKE '%{$location}%')"; 
+0

Всегда полезно использовать скобки для группового условного объединения вместе, даже если оператор приоритет даст вам желаемый результат. Это просто делает ваше намерение более ясным. –

+0

Большое спасибо. Я скопировал всю длину операторов OR в круглых скобках и отсортировал мою проблему. Большое спасибо –

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