MYSQLI按大多数匹配字符查询ORDER

时间:2015-11-20 02:28:09

标签: php mysql

我使用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");

我的问题是,ORDER是否可以通过与id相匹配的大量匹配字符来jQuery。原因是如果我输入“C博客”#39;正在寻找克雷格博客' ' C'会因为电子邮件地址而对我的所有联系人进行注册。[c] om'。

因此,如果我可以通过大多数匹配字符(两次爆炸中增加的数量超过1)将其输入ORDER,那么理论上最重要的结果应该是“Craig Blogs'。

1 个答案:

答案 0 :(得分: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