2015-11-20 25 views
1

我建立了利用mysqli LIKE查询我的项目执行搜索功能的最大量。mysqli的查询ORDER BY匹配字符

我的最后一道障碍是在它输出ORDER

目前的情况:

if(isset($_GET['userInput'])) 
{ 
$search = $_GET['userInput']; 
$search = explode(" ", $search); 
if($search[0] != ''){ 
    $firstterm = $search[0]; 
}else{ 
    $firstterm = '@@@'; 
} 
if($search[1] != ''){ 
    $secondterm = $search[1]; 
}else{ 
    $secondterm = '@@@'; 
}} 

$contact = $mysqli->query(" 
SELECT * FROM contact WHERE 
f_name LIKE '%$firstterm%' 
OR l_name LIKE '%$firstterm%' 

OR f_name LIKE '%$secondterm%' 
OR l_name LIKE '%$secondterm%' 

order by id LIMIT 5"); 

我的问题是,有没有被作为并列于id匹配字符的最大量的方式来ORDER。原因是如果我输入'C Blogs'寻找'Craig Blogs','C'将因为电子邮件地址而注册到我的联系人的每个人。'[c] om'。

因此,如果我可以通过大部分匹配字符来获取它(在两个以上的爆炸中增加的量),理论上最高结果应该是'Craig Blogs'。

+2

我建议你在PHP中使用'levenshtein'函数来比较搜索项。 – Barmar

+0

@Barmar感谢您的建议,我会着眼于此。如果你能指出我正在使用它作为一个例子,将不胜感激。 – Bjaeg

+1

不知道在哪里可以找到示例。这就是搜索引擎的目的。基本上,你只是想使用'usort',并写一个比较函数来比较levenshtein($ a)和'levenshtein($ b)'。 – Barmar

回答

1

你可以指望使用+比赛的数量。在MySQL,一个布尔表达式被视为一个数,其中1为真,0为1:

ORDER BY ((f_name LIKE '%$firstterm%') + 
      (l_name LIKE '%$firstterm%') + 
      (f_name LIKE '%$secondterm%') + 
      (l_name LIKE '%$secondterm%') 
     ) desc 

编辑:

如果要匹配的字符的数目,可以使用的长度开始搜索条件。但是,条款可能会出现不止一次。所以:

ORDER BY ((length(replace(f_name, 'firstterm', concat('firstterm', 'x'))) - length(f_name)) + 
      (length(replace(l_name, 'firstterm', concat('firstterm', 'x'))) - length(l_name)) + 
      (length(replace(f_name, 'secondterm', concat('secondterm', 'x'))) - length(f_name)) + 
      (length(replace(l_name, 'secondterm', concat('secondterm', 'x'))) - length(l_name)) 
     ) desc 
+1

这是匹配项的数量,而不是匹配的字符数。 – Barmar

+0

@Barmar正确。它仍然匹配两个条件(包括电子邮件'.com'),因此c博客仍然意味着它是按id排序的。 – Bjaeg

+0

@Gordon Linoff这仍然不起作用,它似乎与你原来的提交做同样的事情。 – Bjaeg