我正在处理搜索脚本的一部分,其中解析提交的搜索字符串并将每个重要术语放入数组中。然后在 WHERE 子句中循环该数组以搜索 MYSQL 数据库中的多个列。这是一个示例 SQL 代码:
$sql = "SELECT title, question, tag1, tag2, tag3, tag4, tag5 FROM question WHERE ";
while(list($key,$val)=each($split_stemmed)){
if($val<>" " and strlen($val) > 0){
$sql .=
"(title LIKE '$val%'
OR question LIKE '$val%'
OR tag1 LIKE '$val%'
OR tag2 LIKE '$val%'
OR tag3 LIKE '$val%'
OR tag4 LIKE '$val%'
OR tag5 LIKE '$val%') OR";
}
}
$sql=substr($sql,0,(strLen($sql)-3));
$sql .= "GROUP BY q_id ORDER BY
((title LIKE '$val%') +
(question LIKE '$val%') +
(tag1 LIKE '$val%') +
(tag2 LIKE '$val') +
(tag3 LIKE '$val%') +
(tag4 LIKE '$val%') +
(tag5 LIKE '$val%')) desc, title asc";
我遇到的问题是让 ORDER BY 正常工作。ORDER BY 的目的是将查询结果从搜索字符串上的最多命中的顺序排列到最少。我的假设是我需要在 ORDER BY 子句中再次循环遍历数组,但不确定如何执行此操作,或者我什至在该假设中是否正确。有帮手吗?
我知道我可以使用 mysql 全文搜索更简单地完成此操作,但使用的表是 InnoDB,所以我认为目前还不是一个选项。