2016-08-04 51 views
0

我在找做在MySQL/PHP以下搜索的有效途徑...在MySQL/PHP中進行大致搜索匹配的最佳方式是什麼?

想象我有一些在我的數據庫字段我想搜索一下:

User.username 
Name.first_name 
Address.line1 
Phone.number 
Email.email_address 

我也有在PHP下列變量(帶有示例數據)搜索:

$username = "john123"; 
$name = "john"; 
$address = "10 fake street"; 
$phone = "23456789"; 
$email = "[email protected]"; 

假設有0完整的比賽,我將如何編寫一個查詢其可以看到部分匹配,然後由數量返回有序結果火柴?

例如,使用我的示例數據我可能希望看到的結果是這個樣子,

username | name | address  | phone | email    | matches 
---------------------------------------------------------------------------- 
john123 | john | 12 new street | 23456789 | [email protected] | 4 
tim123 | tim | 10 fake street | 23456789 | [email protected] | 2 

只是要注意,我不是在尋找一個通配符搜索這裏。我想返回具有完全匹配的結果,但不一定是使用所有DB字段的完全匹配。並且還希望通過匹配次數排列結果的優先級。

我可以通過將每個查詢作爲單獨的查詢運行,將其加載到PHP數組中,然後計算在大多數數組中找到哪些ID,從而實現它的效率非常低。然而,運行這個數據庫的數據庫每個表有數百萬條記錄,所以這根本不可行。

+0

我在這些場景中使用了[布爾全文搜索](http://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html)。 – haitran

+0

您可以將字符串分解爲字符,並使用mysql中的類似語句匹配一次字符。 –

回答

0
SELECT *, 
    if (username = '$username', 1, 0) + 
    if (name  = '$name' , 1, 0) + 
    if (phone = '$phone' , 1, 0) + 
    if (address = '$address' , 1, 0) AS matches 
FROM tab 
ORDER BY matches DESC 
+0

謝謝,我一定會放棄這一點。如果我在查詢上應用了一個合理的限制,您是否知道這將如何擴展? – user11406

相關問題