如果值可以按任何顺序排列,是否有一种方法可以使用 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%'
)
因此,它会找到任何行,其中 dog
和 big
至少出现在 name
或 description
列中(也可以同时出现)在一栏中)
我的代码让我执行搜索,只要单词的顺序是正确的。
假设我正在搜索 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%'
)
因此,它会找到任何行,其中 dog
和 big
至少出现在 name
或 description
列中(也可以同时出现)在一栏中)