我的代码让我执行搜索,只要单词的顺序正确。
我们说我正在搜索big dog
,但我也想搜索dog big
。 3个或更多单词会变得更复杂。
有没有办法创建一个SQL查询,让我可以搜索任何订单的值?
我能想到的唯一方法是通过多次查询,我手动改变PHP变量的顺序......
<?php
if(isset($_GET['query']) && !empty($_GET['query'])) {
$query = $_GET['query'];
$query_array = explode(' ', $query);
$query_string = '';
$query_counter = 1;
foreach($query_array as $word) {
$query_string .= '%' . $word . (count($query_string) == $query_counter++ ? '%' : '');
}
$query = "SELECT * FROM pages WHERE Name LIKE '$query_string'";
$result = sqlsrv_query($cms->conn, $query);
while($row = sqlsrv_fetch_array($result)) {
extract($row);
echo '<a href="'.$Address.'.html">'.$Name.'</a><br>';
}
sqlsrv_free_stmt($stmt);
}
else {
//echo 'NO GET';
}
?>
答案 0 :(得分:2)
由于您的原始查询字符串类似于%big%dog%
,因此我假设您可以匹配big wild dog
。在这种情况下,您只需使用AND
运算符。
(Name LIKE '%big%" and Name LIKE '%dog%")
答案 1 :(得分:2)
您可以汇总条件并检查其上的每个单词:
$query_array = explode(' ', $query);
$queryParts = array();
foreach ($query_arra AS $value){
$queryParts[]="Name like '%".mysql_real_escape_string($value)."%'";
}
$searchString = implode(" AND ", $queryParts);
搜索字符串现在为Name like '%big%' AND Name like '%dog%'
...取决于搜索关键字的数量。
我经常使用相同的方法,当需要所有关键字出现在至少一列中时。然后,您还需要一个循环来创建所需的AND
条件:
$search = "Big Dog";
$keywords = explode (" ", $search);
$columns = array("Name", "description");
$andParts = array();
foreach ($keywords AS $keyword){
$orParts = array();
foreach($columns AS $column){
$orParts[] = $column . " LIKE '%" . mysql_real_escape_string($keyword) . "%'";
}
$andParts[]= "(" . implode($orParts, " OR ") . ")";
}
$and = implode ($andParts, " AND ");
echo $and;
这将产生查询部分(Name like '%Big%' OR description like '%Big%') AND (Name like '%Dog%' or description like '%Dog%'
)
因此,它会找到任何行,其中dog
和big
出现在name
或description
列中的至少一个列中(也可能同时出现在一列中)列)
答案 2 :(得分:1)
答案 3 :(得分:1)
您可以研究的一件事是ms sql server的全文搜索。
https://msdn.microsoft.com/en-us/library/ms142571.aspx
它类似于“搜索引擎”,因为它使用算法对结果甚至类似的单词进行排名(想想同义词类型查找)
设置不是完全微不足道,但是很容易找到关于这个主题的教程以及如何从FTS查询(因为语法不同于说LIKE'%big%dog% “)
以下是上面链接的页面中的示例查询:
SELECT product_id
FROM products
WHERE CONTAINS(product_description, ”Snap Happy 100EZ” OR FORMSOF(THESAURUS,’Snap Happy’) OR ‘100EZ’)
AND product_cost < 200 ;