назад к заметкам

Релевантный поиск в базе данных MySQL по нескольким словам
Как искать строку в нескольких полях? Когда пользователь ввёл одно слово в строке поиска, - это ясно делаем так:
$str = "слово";  // слово которое хочем найти
$result = $db->sql_query("SELECT * FROM base_markers WHERE title LIKE '%{$str}%' OR address LIKE '%{$str}%' ORDER BY title LIMIT 10");
А что делать если юзерь ввёл более одного слова и необходимо выполнить поиск по разным полям? Вот решение:
  $str = 'два слова';

  $points = $where = array();
  $fields = array('title', 'address');  // в каких полях будем искать фразу
  $str = mysql_real_escape_string($str);
  $words = explode(' ', str_replace(",", "", trim($str)));
  // максимальное количество баллов за точное вхождение фразы
  $max_points = count($words) * 1;

  foreach ($fields as $field) {
    if (count($words) > 1) {
      $points[] = "IF ({$field} LIKE '%{$str}%', {$max_points}, 0)";
    }
    foreach ($words as $w) {
      if (!$w) continue;
      $where[] = "{$field} LIKE '%{$w}%'";
      $points[] = "IF ({$field} LIKE '%{$w}%', 1, 0)";
    }
  }

  $where = "(" . implode(' OR ', $where) . ")";
  $points = implode(' + ', $points);

  $result = $db->sql_query('SELECT *, (' . $points . ') AS points FROM base_markers ORDER BY points DESC LIMIT 20');
  while($row = $db->sql_fetchassoc($result)){
    $output[] = $row;  // это наш массив в котором будут результаты поиска
  }