所以我在这个网站上工作,我刚刚添加了一个搜索按钮。 当我使用像
这样的简单搜索查询时,一切正常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%'
这将通过查看字段'username',firstname,lastname等返回名称与数据库中的john匹配的所有id。
然而,问题是,当用户在搜索参数之间插入一个空格(实际上这意味着他是用两个名字搜索学生)时,结果就是什么。我认为这是因为它在每个字段中独立地寻找搜索参数(比如'john doe')。
我如何解决这个问题。
答案 0 :(得分:2)
我不确定您希望如何处理这些内容,您可以将其添加到WHERE子句中,以便搜索firstname和lastname字段,并在它们之间留一个空格。
CONCAT(`firstname`, ' ', `lastname`) LIKE 'jo%'
或者您可能希望删除通配符并进行精确搜索。
CONCAT(`firstname`, ' ', `lastname`) = 'jo'
答案 1 :(得分:0)
如果你想跨多个列进行搜索/匹配,你真的需要研究MySQL的全文搜索功能。有关开始使用的文档,请参阅此链接:
http://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html
这比在一堆列中尝试LIKE
要好得多。
答案 2 :(得分:0)
SELECT * FROM student
WHERE username LIKE REPLACE(username, ' ', '') = REPLACE("Twitt er", ' ', '')
答案 3 :(得分:0)
您可以假设存在空格意味着用户正在搜索名/姓的组合。 (实际上你的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
这有些伪劣,但你得到了我希望的图片。
有更优雅的方式来实现这样的sql-builder
,但我提供它作为一种说明如何开始思考它的方式 - “使用FULLTEXT”评论放在一边。
答案 4 :(得分:0)
有两种方法可以做到这一点:
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)使用FULLTEXT搜索表引擎MYISAM 详细了解FULLText
FULLTEXT是搜索应用程序的最佳选择