2017-01-16 79 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函数 - 您应该自己添加DB。 –

+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

您可以使用诸如查询为: 以下示例为哪些客户名称与KH

select * from customer where name like '%kh' 

下面的例子将返回从表客户的所有记录结束将返回从表客户的所有记录其客户名字开始与KH

select * from customer where name like 'kh%' 

下面的例子从表客户返回所有记录其客户名称的中间世界KH

select * from customer where name like 'kh%' 

,如果你想更具体的记录,然后添加一些和/或条件查询

我建议你阅读本 http://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html#operator_like

+0

谢谢,但如果我搜索,例如玩具总动员,它只给出那些同时包含玩具和故事单词的东西。没有给出例如玩具士兵。 – 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őkviadala - futótűz“,”极品飞车“,”300 - 一个birodalom hajnala“等,对不起匈牙利的例子。 – user7425848