MYSQLI通过大多数匹配字符查询ORDER


MYSQLI Query ORDER by most amount of matching characters

我已经使用mysqli LIKE查询在我的项目上创建了一个搜索函数。

我的最后一个障碍是它输出的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'。

因此,如果我能通过大多数匹配字符的数量(两者的添加量在超过1的地方爆炸)将其发送到ORDER,那么理论上最重要的结果应该是"Craig Blogs"。

您可以使用+计算匹配数。在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