2017-01-16 5 views
1

Я хотел бы выбрать те фильмы, которые имеют похожие названия. Я нашел это, но таким образом он не работает, он ничего не дает. Я хотел бы дать История игрушек 2 История игрушек 3 и другие с похожим названием, как игрушка soldielrs и т.д.Как написать запрос для выбора похожих заголовков?

$title = "Toy Story"; 
$query = mysql_query("SELECT title, year, poster, LEVENSHTEIN_RATIO(".$title.", title) as textDiff FROM movies HAVING textDiff > 60"); 

Я могу сравнивать строки в PHP с помощью этой функции:

static public function string_compare($str_a, $str_b) 
{ 
    $length = strlen($str_a); 
    $length_b = strlen($str_b); 

    $i = 0; 
    $segmentcount = 0; 
    $segmentsinfo = array(); 
    $segment = ''; 
    while ($i < $length) 
    { 
     $char = substr($str_a, $i, 1); 
     if (strpos($str_b, $char) !== FALSE) 
     {    
      $segment = $segment.$char; 
      if (strpos($str_b, $segment) !== FALSE) 
      { 
       $segmentpos_a = $i - strlen($segment) + 1; 
       $segmentpos_b = strpos($str_b, $segment); 
       $positiondiff = abs($segmentpos_a - $segmentpos_b); 
       $posfactor = ($length - $positiondiff)/$length_b; 
       $lengthfactor = strlen($segment)/$length; 
       $segmentsinfo[$segmentcount] = array('segment' => $segment, 'score' => ($posfactor * $lengthfactor)); 
      } 
      else 
      { 
       $segment = ''; 
       $i--; 
       $segmentcount++; 
      } 
     } 
     else 
     { 
      $segment = ''; 
      $segmentcount++; 
     } 
     $i++; 
    } 

    // PHP 5.3 lambda in array_map  
    $totalscore = array_sum(array_map(function($v) { return $v['score']; }, $segmentsinfo)); 
    return $totalscore;  
} 

Но как Я сравниваю запрос SELECT или любым другим способом?

+0

«LEVENSHTEIN_RATIO» не является функцией MySQL - вы должны добавить его самостоятельно. –

+0

Но вы можете использовать «LIKE» для таких запросов, например: 'SELECT title, year, poster FROM movies WHERE title LIKE '%". $ Title. "%'" ' –

+1

в mysql у вас есть * SOUNDEX() * http : //dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_soundex – donald123

ответ

0

Вы можете использовать как запросы для этого: Следующий пример возвращает все записи из таблицы клиента, для которого имя клиента заканчивается кк

select * from customer where name like '%kh' 

Следующий пример возвращает все записи из таблицы клиента, для которого клиент Имя начать с кк

select * from customer where name like 'kh%' 

Следующий пример возвращает все записи из таблицы клиента, для которого средний мир имя клиента является кк

select * from customer where name like 'kh%' 

если вы хотите более конкретной записи затем добавить некоторые и/или условие в запросе

Я рекомендую вам прочитать http://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html#operator_like

+0

Спасибо, но если я ищу, например, Toy Story, он возвращает только те, которые содержат как игрушечные, так и сюжетные слова.Не давали, например, Toy Soldiers. – user7425848

0

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

$search_array = explode(" ", "Toy story"); 

$query = "SELECT title, year, poster FROM movies WHERE title REGEXP '".implode("|", $search_array)."'"; 

Это, вероятно, соответствует много строк, но вы могли бы сделать более ограничительный регулярное выражение.

+0

Я пробовал это, но обычно давал случайный результат. Если бы я попытался исказить «Vigyázz , kész, szörf! 2. «Это дает мне« Az éhezők viadala - futótűz »,« Need for Speed ​​»,« 300 - биродал хайнала »и т. Д. Извините за венгерский пример. – user7425848

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