所以我正在这个网站上工作,我只是添加了一个搜索按钮。当我使用简单的搜索查询时,一切正常,例如
SELECT `student_id` FROM `student` WHERE `username` LIKE 'jo%' OR `firstname` LIKE 'jo%' OR `lastname` LIKE 'jo%' OR `surname` LIKE 'jo%' OR `email` LIKE 'jo%'
这将通过查看字段"用户名"、"名字"、"姓氏"等,从数据库中返回名称与 john 匹配的所有 id。
然而,问题是,当用户在搜索参数之间插入一个空格时(这实质上意味着他正在通过两个名字搜索学生),结果一无所获。
我认为这是因为它在每个字段中独立地寻找搜索参数(例如,"john doe")。
我该如何解决这个问题。
我不确定您想如何处理这些,您可以将其添加到您的 WHERE 子句中,以搜索名字和姓氏字段,它们之间有一个空格。
CONCAT(`firstname`, ' ', `lastname`) LIKE 'jo%'
或者,您可能希望删除通配符并进行精确搜索。
CONCAT(`firstname`, ' ', `lastname`) = 'jo'
如果你想跨多个列进行搜索/匹配,你真的需要研究MySQL全文搜索功能。 请参阅此链接以获取文档以帮助您入门:
http://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html
这将比尝试跨一堆列LIKE
更好地扩展。
SELECT * FROM student
WHERE username LIKE REPLACE(username, ' ', '') = REPLACE("Twitt er", ' ', '')
您可以假设空格的存在意味着用户正在搜索名字/姓氏组合。(实际上,您的 UI 可以说明这一点)。
然后使用
$name = split(' ' , $incoming);
然后,创建一个条件检查$name[1]是否存在,然后确定是否要搜索
$where_clause = WHERE firstname = $name[0] AND lastname = $name[1];
如果失败,请回退到:
$where_clause = WHERE firstname = $name[0]
或
$where_clause = WHERE lastname = $name[1]
等等。
然后像这样使用它:
SELECT `student_id` FROM `student` . $where_clause
这有点伪codis,但你得到我希望的图片。
有更优雅的方法来实现这样的sql-builder
,但我提供它作为一种说明你如何开始思考它的方式 - "使用全文"评论放在一边。
有两种方法可以做到这一点:
1)当你试图
'
$search_term= "Mike Brant";
$term_part = preg_split('/ /', $search_term);
/*
term_part[0]=Mike
term_part[1]=Brant
*/
foreach($term_part as $value){
$like. = " `username` LIKE '".$value."%' OR `firstname` LIKE '".$value."%' OR `lastname` LIKE '".$value."%' OR `surname` LIKE '".$value."%' OR `email` LIKE '".$value."%' OR "
}
$like = substr($like, 0, -3);
$sql = "SELECT `student_id` FROM `student` WHERE ".$like.";
`
2)使用全文搜索表引擎MYISAM 了解有关 FULLText 的更多信息
全文是搜索应用程序的最佳选择