是否可以在mysql、PHP或CODEIGNITER中搜索显示多个可能结果的多个单词
我有sql中的表 员工表是否可以在mysql、PHP或CODEIGNITER中搜索显示多个可能结果的多个单词,php,mysql,codeigniter,Php,Mysql,Codeigniter,我有sql中的表 员工表 ID firstname lastname bandname ------------------------------------ 1 John Lennon Beatles 2 Paul Mccartney Beatles 3 Ringo Starr Beatles 4 George Harrison Beatles 现在如果我搜索“George Mcc
ID firstname lastname bandname
------------------------------------
1 John Lennon Beatles
2 Paul Mccartney Beatles
3 Ringo Starr Beatles
4 George Harrison Beatles
现在如果我搜索“George Mccartney”,结果应该是ID为4和2的行
或者如果搜索“1 Paul Starr”,结果应该是包含这三个单词中的三行
$search="1 Paul Starr";
list($id,$fn,$ln)=explode(" ",$search);
/*
Sanitize these values or prepare the query. An example could be
Remember, if you neither sanitize these values nor use prepared statements, its
Dangerous!
*/
$query="SELECT * FROM yourTABLE
WHERE ID=$id
OR firstname LIKE '%$fn%'
OR lastname LIKE '%$ln%' ";
// Or better use Prepared statements
编辑
好的,那么它们可以按任何顺序排列?那你就可以了
$search="1 Paul Starr";
list($v1,$v2,$v3)=explode(" ",$search);
//Sanitize, Remember?
$query="SELECT * FROM yourTABLE
WHERE ID IN ('$v1','$v2','$v3')
OR firstname IN ('$v1','$v2','$v3')
OR lastname IN ('$v1','$v2','$v3')";
SELECT ID,firstname,lastname
FROM employee
WHERE MATCH (ID,firstname,lastname) AGAINST ('1 Paul Starr')
可能是更好的方法,但这里有一个例子:
SELECT id, firstname, lastname
FROM employee
WHERE firstname = 'input_name'
OR lastname = 'input_lastname'
当您不确定用户输入,如“1 Paul Starr”
时,您可以按照以下步骤进行操作:
$a="George Mccartney hghh hghh ....whatever";
$name=explode(" ",$a);
$count=count($name);
for($i=0;$i<$count;$i++)
{
$query="select * from employee
where firstname like '%$name[i]%'
or
lastname like '%$name[i]%'
or
id='$name[i]' ";
-----your code to print the output or take the output in array----
}
$a=“乔治·麦卡特尼……随便什么”;
$name=explode(“,$a”);
$count=计数($name);
对于($i=0;$i请尝试使用全文索引,如下所示:
ALTER TABLE employee ADD FULLTEXT INDEX (ID,firstname,lastname);
那你就可以了
$search="1 Paul Starr";
list($v1,$v2,$v3)=explode(" ",$search);
//Sanitize, Remember?
$query="SELECT * FROM yourTABLE
WHERE ID IN ('$v1','$v2','$v3')
OR firstname IN ('$v1','$v2','$v3')
OR lastname IN ('$v1','$v2','$v3')";
SELECT ID,firstname,lastname
FROM employee
WHERE MATCH (ID,firstname,lastname) AGAINST ('1 Paul Starr')
请看这里
用PHP代码替换@search,因为我不熟悉PHP
更新的答案:允许搜索子字符串,如:
“Geor”返回1行“George”
“George Pau”返回两行“George”和“Paul”
或者,如果您愿意,下面使用LOCATE
(更短的查询)
拆分字符串并检查是否合适columns@Hanky웃如果用户输入了一个不符合顺序的单词,比如“列侬3哈里森”,该怎么办我的答案忽略了顺序,它之所以有效,是因为它使用像来匹配任何相似的东西。如果它不符合顺序怎么办?像约翰1斯塔尔?必须有一个模式,没有魔法让计算机知道什么是名字,什么是姓氏,如果你按任意顺序排列,没有任何模式。哦,我明白了。现在是另一个问题。如果我的f第一个名字有两个名字,还有姓氏。像约翰·保罗·德拉克鲁兹?哦,我明白了……嗯,不管怎样。谢谢你的回答:)非常感谢appreciated@Hanky웃Panky我不认为他的意思是计算机必须能够看到姓和名是什么。我想他只是想检查一下,即使订单搞乱了。如果订单搞错了怎么办?像john 1 starr?那是y,我用了两个like语句,它将匹配firstname和lastname的模式,或者更好。你可以使用for循环检查所有可能的情况,ID呢?@Hanky웃Panky我认为OP希望使用名称而不是id获取行,或者如果搜索“1 Paul Starr”,结果应该是包含这三个单词中的三行。
如果不符合顺序怎么办?像john 1 starr?很有趣,你知道为什么我不能取消对ALTER TABLE行的注释吗?这里,它说所用的表类型不支持全文索引是不是只有sqlFiddle不允许?全文索引只能用于MyISAM表。看到这里,我遇到了这个错误,找不到与我使用XAMP的列列表匹配的全文索引this@Vincent你试过我的答案了吗?我想知道如果我的表有另一列呢(bandname)的值是“Beatles”。现在我只搜索了这个“George Beatles”。结果是4行。其中应该只有1行包含George harrisonI。我看到你已经更新了问题,所以所有4行都包含“Beatles”。如果不添加像CONCAT(“%”,bandname,“%”这样的,你想在bandname上搜索还是不搜索
哦,我明白了。那么,如果我添加另一个名称相同的“George Harrison”,但乐队名称不同怎么办?还有@search。可以这样设置吗?我没有设置$param,然后设置“SELECT*FROM employee WHERE@”。$variable。比如CONCAT(“%”,id,“%”)@Vincent,如果你想让“Geor”返回一行“George”和“pau”返回一行乐队名称“Paul”和“Geor Pau”返回2行“George”和“Paul”,请参见底部我的更新答案当用户输入1个搜索词最多3个搜索词时,此选项有效
SELECT *
FROM employee
WHERE
id LIKE CONCAT('%',SUBSTRING_INDEX(@search,' ',1),'%')
OR id LIKE CONCAT('%',SUBSTRING_INDEX(SUBSTRING_INDEX(@search,' ',2),' ',-1),'%')
OR id LIKE CONCAT('%',SUBSTRING_INDEX(SUBSTRING_INDEX(@search,' ',3),' ',-1),'%')
OR firstname LIKE CONCAT('%',SUBSTRING_INDEX(@search,' ',1),'%')
OR firstname LIKE CONCAT('%',SUBSTRING_INDEX(SUBSTRING_INDEX(@search,' ',2),' ',-1),'%')
OR firstname LIKE CONCAT('%',SUBSTRING_INDEX(SUBSTRING_INDEX(@search,' ',3),' ',-1),'%')
OR lastname LIKE CONCAT('%',SUBSTRING_INDEX(@search,' ',1),'%')
OR lastname LIKE CONCAT('%',SUBSTRING_INDEX(SUBSTRING_INDEX(@search,' ',2),' ',-1),'%')
OR lastname LIKE CONCAT('%',SUBSTRING_INDEX(SUBSTRING_INDEX(@search,' ',3),' ',-1),'%')
;
SELECT *
FROM employee
WHERE
LOCATE(SUBSTRING_INDEX(@search,' ',1) ,CONCAT(id,firstname,lastname))>0
OR LOCATE(SUBSTRING_INDEX(SUBSTRING_INDEX(@search,' ',2),' ',-1),CONCAT(id,firstname,lastname))>0
OR LOCATE(SUBSTRING_INDEX(SUBSTRING_INDEX(@search,' ',3),' ',-1),CONCAT(id,firstname,lastname))>0
;