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

时间:2017-01-06 06:39:47

标签: php mysql

我有以下代码(通过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则不会显示。

无论订单是什么,我如何匹配它们?

4 个答案:

答案 0 :(得分:1)

  

问题是,如果街道名称是Heavens Road并且有人打字   道路天堂它没有出现。

并没有理由这样做。 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));

这可能会很慢(而且您的现有查询不会更快)您可能希望投资全文搜索。

答案 1 :(得分:1)

由于SQL无法搜索单个名称,请尝试根据Heavens 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%)

答案 2 :(得分:0)

你可以这样搜索,

在每次搜索时,您将获得大约数据,而不是确切的数据:例如

如果街道名称是 Heavens Road 并且你有 Heavens Roadxyz,Road Heavens,... ,如果您将在代码下面,那么您将获得所有约结果

SQL:

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

将此附加到您的SQL查询

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

答案 3 :(得分:0)

你的案子很特别,无论如何都是不可能的,

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

请参阅参考link