[英]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.