我有以下代码(通过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
则不会显示。
无论订单是什么,我如何匹配它们?
答案 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