我正在构建一个简单的搜索算法,我想用空格打破我的字符串,并在其上搜索我的数据库,如下所示:
$search = "Sony TV with FullHD support";
$search = explode( ' ', $search );
SELECT name FROM Products WHERE name LIKE %$search[1]% AND name LIKE %$search[2]% LIMIT 6
这可能吗?
提前致谢
答案 0 :(得分:40)
是的,您可以使用SQL IN
运算符来搜索多个绝对值:
SELECT name FROM products WHERE name IN ( 'Value1', 'Value2', ... );
如果您想使用LIKE
,则需要使用OR
代替:
SELECT name FROM products WHERE name LIKE '%Value1' OR name LIKE '%Value2';
使用AND
(正如您所尝试的)要求所有条件都为真,使用OR
要求至少有一个为真。
答案 1 :(得分:4)
试试这个
使用UNION
$sql = '';
$count = 0;
foreach($search as $text)
{
if($count > 0)
$sql = $sql."UNION Select name From myTable WHERE Name LIKE '%$text%'";
else
$sql = $sql."Select name From myTable WHERE Name LIKE '%$text%'";
$count++;
}
使用WHERE IN
$comma_separated = "('" . implode("','", $search) . "')"; // ('1','2','3')
$sql = "Select name From myTable WHERE name IN ".$comma_separated ;
答案 2 :(得分:1)
这在两种情况下都可以完美地工作:一个或多个字段搜索多个单词。
希望这会对某人有所帮助。谢谢
declare @searchTrm varchar(MAX)='one two three four';
--select value from STRING_SPLIT(@searchTrm, ' ') where trim(value)<>''
select * from Bols
WHERE EXISTS (SELECT value
FROM STRING_SPLIT(@searchTrm, ' ')
WHERE
trim(value)<>''
and(
BolNumber like '%'+ value+'%'
or UserComment like '%'+ value+'%'
or RequesterId like '%'+ value+'%' )
)
答案 3 :(得分:0)
这已部分回答: MySQL Like multiple values
我建议反对
$ search = explode(&#39;&#39;,$ search);
并将它们直接输入到SQL查询中,因为这样可以通过搜索栏轻松进行SQL注入。你必须首先逃避角色,以防他们尝试一些有趣的事情:&#34; - ; DROP TABLE名称;
$ search = str_replace(&#39;&#34;&#39;,&#34;&#39;&#39;&#34;,搜索);
但即使这样也不完全安全。您必须尝试使用SQL预处理语句更安全。使用正则表达式更容易构建一个函数来准备和创建你想要的东西。
function makeSQL_search_pattern($search) {
search_pattern = false;
//escape the special regex chars
$search = str_replace('"', "''", $search);
$search = str_replace('^', "\\^", $search);
$search = str_replace('$', "\\$", $search);
$search = str_replace('.', "\\.", $search);
$search = str_replace('[', "\\[", $search);
$search = str_replace(']', "\\]", $search);
$search = str_replace('|', "\\|", $search);
$search = str_replace('*', "\\*", $search);
$search = str_replace('+', "\\+", $search);
$search = str_replace('{', "\\{", $search);
$search = str_replace('}', "\\}", $search);
$search = explode(" ", $search);
for ($i = 0; $i < count($search); $i++) {
if ($i > 0 && $i < count($search) ) {
$search_pattern .= "|";
}
$search_pattern .= $search[$i];
}
return search_pattern;
}
$search_pattern = makeSQL_search_pattern($search);
$sql_query = "SELECT name FROM Products WHERE name REGEXP :search LIMIT 6"
$stmt = pdo->prepare($sql_query);
$stmt->bindParam(":search", $search_pattern, PDO::PARAM_STR);
$stmt->execute();
我没有测试过这段代码,但这就是我在你的情况下会做的。 我希望这会有所帮助。
答案 4 :(得分:0)
您可以尝试执行以下查询:
ThreadPool
<块引用>
请注意管道符号前后不能有空格 (|).