2014-01-11 113 views
0

如何实现名称匹配。像“John S Smith”这样的东西必须与mysql数据库中的“Smith John S”匹配。即单词可以是无序的。MySql:在类似子句中匹配的无序单词

是否可以在单个SQL查询中执行此操作?由于它的名称不会超过3个字。

我的代码在逻辑上不正确。任何帮助将不胜感激。

$words=explode(" ", $name); 

$sql="SELECT * FROM sent WHERE 1=1"; 

foreach ($words as $word) 
{ 
    $sql.=" AND customer_name LIKE '%$word%'"; 
} 

生成的SQL,我看起来像这样。

$sql="SELECT * FROM sent WHERE 1=1 AND customer_name LIKE '%John%' AND customer_name LIKE '%S%' AND customer_name LIKE '%Smith%'" ; 
+0

我认为你不需要爆炸名称,你可以简单地做它像select * from发送的地方customer_name LIKE“%”。$ name。“%”; –

+0

@abdulraziq“约翰史密斯”必须匹配“史密斯约翰S” – coding

+0

你试过上面的查询我给你看? –

回答

2

下面的代码将首先发现的话&所有可能的组合,然后与数据库 匹配它,因为你的代码在最大只有3个字,所以它不是一个坏的选择

<?php 
    $name ='John S Smith'; 
    $words=explode(" ", $name);; 

    function get_all_combination($arr, $temp_string, &$collect) { 
     if ($temp_string != "") 
      $collect []= $temp_string; 

     for ($i=0; $i<sizeof($arr);$i++) { 
      $arrcopy = $arr; 
      $elem = array_splice($arrcopy, $i, 1); // removes and returns the i'th element 
      if (sizeof($arrcopy) > 0) { 
       get_all_combination($arrcopy, $temp_string ." " . $elem[0], $collect); 
      } else { 
       $collect []= $temp_string. " " . $elem[0]; 
      } 
     } 
    } 

    $collect = array(); 
    get_all_combination($words, "", $collect); 

     /* 
     $collect now have 

     [0] => John 
     [1] => John S 
     [2] => John S Smith 
     [3] => John Smith 
     [4] => John Smith S 
     [5] => S 
     [6] => S John 
     [7] => S John Smith 
     [8] => S Smith 
     [9] => S Smith John 
     [10] => Smith 
     [11] => Smith John 
     [12] => Smith John S 
     [13] => Smith S 
     [14] => Smith S John 
     */ 

    $sql="SELECT * FROM sent WHERE 1=1 AND (customer_name = '".implode("' OR customer_name = '",$collect)."')" ; 




    ?> 
+1

我花了时间去做,所以请问你是否需要任何帮助,这样我的努力不会浪费 – sanjeev

+0

不错的努力@sanjeev –

+0

@sanjeev感谢您的努力:-)。我将在此扩展我的代码。 – coding

相关问题