поиск по ключевому слову 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

Решение

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

Редактировать :

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

  • завернуть каждый 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}%')";
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]