如果值可以按任何顺序排列,是否有一种方法可以使用 SQL 查询得到 return 结果?

Is there a way to use SQL query that would return results if values can be in any order?

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

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

    ?>

myisam 支持全文搜索: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

您可以研究的一件事是 ms sql 服务器的全文搜索。

https://msdn.microsoft.com/en-us/library/ms142571.aspx

它与 "search engine" 的相似之处在于它使用一种算法来对结果甚至相似词进行排名(想想词库类型查找)

设置起来确实不简单,但很容易找到有关该主题的教程以及如何从 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 ;

由于您的原始查询字符串类似于 %big%dog%,因此我假设您可以匹配 big wild dog。在这种情况下,您可以只使用 AND 运算符。

(Name LIKE '%big%" and Name LIKE '%dog%")

您可以 assemble 您的条件并单独检查每个词:

$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 列中(也可以同时出现)在一栏中)