有没有办法使用SQL查询,如果值可以按任何顺序返回结果?

时间:2015-02-18 18:30:15

标签: php sql sql-server search

我的代码让我执行搜索,只要单词的顺序正确。

我们说我正在搜索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';
        }

    ?>

4 个答案:

答案 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%'

因此,它会找到任何行,其中dogbig出现在namedescription列中的至少一个列中(也可能同时出现在一列中)列)

答案 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 ;