如何编写查询以选择类似的标题?

时间:2017-01-16 14:52:14

标签: php mysql

我想选择那些有类似头衔的电影。 我发现了这一点,但这种方式不起作用,它什么都没有。我想给玩具故事2,玩具故事3和其他类似标题的玩具销售商等等。

$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查询或其他任何方式进行比较?

2 个答案:

答案 0 :(得分:0)

你可以使用类似的查询: 以下示例将返回表customer的所有记录,其客户名称以kh

结尾
select * from customer where name like '%kh'

以下示例将返回表customer的所有记录,其客户名称以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

答案 1 :(得分:0)

我认为您可能需要定义需要将类似的东西视为匹配。 但是,如果您只想搜索包含单词,可以按空格分割搜索字符串,并在查询中的REGEXP中使用它

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

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

这可能会匹配很多行,但您可以制作更具限制性的正则表达式。