我已经使用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