是否可以在mysql、PHP或CODEIGNITER中搜索显示多个可能结果的多个单词

是否可以在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

我有sql中的表

员工表

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
;