2015-11-20 103 views
1

我建立了利用mysqli LIKE查詢我的項目執行搜索功能的最大量。mysqli的查詢ORDER BY匹配字符

我的最後一道障礙是在它輸出ORDER

目前的情況:

if(isset($_GET['userInput'])) 
{ 
$search = $_GET['userInput']; 
$search = explode(" ", $search); 
if($search[0] != ''){ 
    $firstterm = $search[0]; 
}else{ 
    $firstterm = '@@@'; 
} 
if($search[1] != ''){ 
    $secondterm = $search[1]; 
}else{ 
    $secondterm = '@@@'; 
}} 

$contact = $mysqli->query(" 
SELECT * FROM contact WHERE 
f_name LIKE '%$firstterm%' 
OR l_name LIKE '%$firstterm%' 

OR f_name LIKE '%$secondterm%' 
OR l_name LIKE '%$secondterm%' 

order by id LIMIT 5"); 

我的問題是,有沒有被作爲並列於id匹配字符的最大量的方式來ORDER。原因是如果我輸入'C Blogs'尋找'Craig Blogs','C'將因爲電子郵件地址而註冊到我的聯繫人的每個人。'[c] om'。

因此,如果我可以通過大部分匹配字符來獲取它(在兩個以上的爆炸中增加的量),理論上最高結果應該是'Craig Blogs'。

+2

我建議你在PHP中使用'levenshtein'函數來比較搜索項。 – Barmar

+0

@Barmar感謝您的建議,我會着眼於此。如果你能指出我正在使用它作爲一個例子,將不勝感激。 – Bjaeg

+1

不知道在哪裏可以找到示例。這就是搜索引擎的目的。基本上,你只是想使用'usort',並寫一個比較函數來比較levenshtein($ a)和'levenshtein($ b)'。 – Barmar

回答

1

你可以指望使用+比賽的數量。在MySQL,一個布爾表達式被視爲一個數,其中1爲真,0爲1:

ORDER BY ((f_name LIKE '%$firstterm%') + 
      (l_name LIKE '%$firstterm%') + 
      (f_name LIKE '%$secondterm%') + 
      (l_name LIKE '%$secondterm%') 
     ) desc 

編輯:

如果要匹配的字符的數目,可以使用的長度開始搜索條件。但是,條款可能會出現不止一次。所以:

ORDER BY ((length(replace(f_name, 'firstterm', concat('firstterm', 'x'))) - length(f_name)) + 
      (length(replace(l_name, 'firstterm', concat('firstterm', 'x'))) - length(l_name)) + 
      (length(replace(f_name, 'secondterm', concat('secondterm', 'x'))) - length(f_name)) + 
      (length(replace(l_name, 'secondterm', concat('secondterm', 'x'))) - length(l_name)) 
     ) desc 
+1

這是匹配項的數量,而不是匹配的字符數。 – Barmar

+0

@Barmar正確。它仍然匹配兩個條件(包括電子郵件'.com'),因此c博客仍然意味着它是按id排序的。 – Bjaeg

+0

@Gordon Linoff這仍然不起作用,它似乎與你原來的提交做同樣的事情。 – Bjaeg