如何在另一个字符串的中间专门搜索字符串

时间:2013-08-06 20:42:43

标签: php sql string sql-like relevance

在表的所有列中搜索子字符串。结果按以下顺序显示:
1.从子串开始的第一个结果 2.然后导致子串在中间而不是最后 3.然后导致子串最后。
中间而不是最后中搜索子字符串时会出现问题,因为%substring%也会包含%substring,实际上最后。因此订单不会被保留。

foreach($results as $r){
$append1 ="select * from ".$tablename." WHERE ".$r['COLUMN_NAME']." like'".$substring."%'union ";
$query1 = $query1.$append1;
}  
foreach($results as $r){
$append2 ="select * from ".$tablename." WHERE ".$r['COLUMN_NAME']." like'%".$substring."%'union";
$query2 = $query2.$append2;
}
foreach($results as $r){
$append3 ="select * from ".$tablename." WHERE ".$r['COLUMN_NAME']." like'%".$substring."'union";
$query3 = $query3.$append3;
}
$query4=$query1.$query2.$query3;
$query4 = substr($query4, 0, -5);

3 个答案:

答案 0 :(得分:1)

LIKE运算符使用两个通配符。您已经了解%,但也有_(基本上是“任何一个角色”)。

所以你可以像

那样进行第二次查询
$append2 ="SELECT * FROM $tablename WHERE {$r['COLUMN_NAME']} LIKE '_%{$substring}%_' union";

它应该只匹配$substring之前至少有一个字符的位置和之后的字符。

答案 1 :(得分:0)

您需要在WHERE子句中添加一个额外的位以排除字符串在最后的位置。

$append2 ="select * from ".$tablename." WHERE ".$r['COLUMN_NAME']." like '%".$substring."%' AND ".$r['COLUMN_NAME']." NOT like '%".$substring."' union";

顺便说一下,不推荐使用mysql_ *函数,你应该真正研究mysqli或PDO。

答案 2 :(得分:0)

您可以使用regular expressions代替。例如:

 $append1 ="select * from ".$tablename." WHERE ".$r['COLUMN_NAME']." REGEXP '".$substring."$' union ";  // match ending

 $append1 ="select * from ".$tablename." WHERE ".$r['COLUMN_NAME']." REGEXP '[[:print:]]".$substring."[[:print:]]' union ";  // match middle

 $append1 ="select * from ".$tablename." WHERE ".$r['COLUMN_NAME']." REGEXP '^".$substring."' union ";  // match beginning