繁体   English   中英

如何匹配mySQL结果中的单词,无论它们的顺序如何?

[英]How do I match words in mySQL results no matter the order they are in?

我有以下代码(通过PHP通过mySQL)从数据库获取街道名称:

SELECT id, gps, street_name 
FROM streets 
WHERE street_name 
LIKE '%".$search."%' OR '%(".$search.")%' 
ORDER BY CAST(street_name AS UNSIGNED), street_name

问题是,如果街道名称是Heavens Road并且有人键入Road Heavens它就不会显示。

无论顺序如何,我该如何匹配它们?

问题是,如果街道名称是Heavens Road,并且有人键入Road Heavens,它就不会显示。

而且没有理由应该这样做。 LIKE比较器将查找特定模式。 如果您想颠倒短语中的单词并再次搜索,您应该自己做。

$term = "Heavens Road"
$rev = array_reverse(explode(" ", $term));

$stmt = $pdo->prepare("SELECT id, gps, street_name FROM streets 
WHERE street_name LIKE %:term%  OR street_name like %:rev%' ORDER BY CAST(street_name AS UNSIGNED), street_name
");

$stmt->execute(array("term"=>$term, "rev"=>$rev));

您可能想在全文搜索上进行投资,这可能会很慢(并且您的现有查询不会更快)。

如在SQL中无法搜索单个名称一样,请尝试在最终查询中基于空格(例如Heavens Road分割名称并附加到字符串('%Heavens%') OR (%Road%)('%Heavens%') OR (%Road%)之后。

SELECT id, gps, street_name 
FROM streets 
WHERE street_name 
LIKE ('%Heavens%') OR (%Road%)
ORDER BY CAST(street_name AS UNSIGNED), street_name

例如,如果有更多条件,例如LIKE (%1term%) OR (%2term%) OR (%3term%) OR (%4term%)

您可以像这样搜索

在每次搜索中,您将获得近似数据,而不是确切数据:

如果街道名称是Heavens Road,并且您有Heavens Roadxyz,Road Heavens,... ,如果您将在下面的代码中进行编码,则将获得所有近似结果。

SQL:

('%heavens%') OR (%road%)

将此附加到您的SQL查询中

您也可以根据需要编写AND查询

您的情况很特殊,无论如何都不可能,

function wordcombos ($words) {
        if ( count($words) <= 1 ) {
            $result = $words;
        } else {
            $result = array();
            for ( $i = 0; $i < count($words); ++$i ) {
                $firstword = $words[$i];
                $remainingwords = array();
                for ( $j = 0; $j < count($words); ++$j ) {
                    if ( $i <> $j ) $remainingwords[] = $words[$j];
                }
                $combos = wordcombos($remainingwords);
                for ( $j = 0; $j < count($combos); ++$j ) {
                    $result[] = $firstword . ' ' . $combos[$j];
                }
            }
        }
        return $result;
    }

$search_arr = explode(" ", $search);
$temp_arr = wordcombos($search_arr);
$condition = ' street_name like ';
foreach($temp_arr as $v){
$condition .= " '%".$v."%' OR";
}
$condition = rtrim($condition,"OR");

和查询将去

SELECT id, gps, street_name 
FROM streets 
WHERE $condition
ORDER BY CAST(street_name AS UNSIGNED), street_name

请参阅参考链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM