2015-11-19 23 views
1

我正在使用LIKE mysqli查詢爲我的項目創建搜索功能。涵蓋所有級聯組合的簡單方法

在我嘗試將功能設置爲'用戶友好'時,我可能會發現自己包括很多CONCAT請求。

I.e.

$contact = $mysqli->query("SELECT * FROM contact WHERE k_name LIKE '%$searching%' OR f_name LIKE '%$searching%' OR l_name LIKE '%$searching%' OR concat(f_name,l_name) LIKE '%$searching%' OR concat(k_name, l_name) LIKE '%$searching%' OR mobile LIKE '%$searching%' OR phone LIKE '%$searching%' OR w_phone LIKE '%$searching%' OR w_fax LIKE '%$searching%' OR k_email LIKE '%$searching%' OR email LIKE '%$searching%' OR w_email LIKE '%$searching%' order by id LIMIT 5"); 

這裏的想法是允許用戶以任何順序鍵入他們的搜索,以準確找到他們正在尋找的東西。

例如,用戶'A'可能不記得街道的名稱,因此他們搜索街道號碼和郊區。或者他們可能會記住一個聯繫人的名字和郊區,但不是姓氏。

所以我的問題是,是否有一個簡單的條目,將涵蓋單個WHERE選擇的所有可能的連接組合?

$contact = $mysqli->query("SELECT * FROM contact WHERE concat(all) LIKE '%$searching%' OR f_name LIKE '%$searching%' OR l_name LIKE '%$searching%'OR mobile LIKE '%$searching%' OR phone LIKE '%$searching%' OR w_phone LIKE '%$searching%' OR w_fax LIKE '%$searching%' OR k_email LIKE '%$searching%' OR email LIKE '%$searching%' OR w_email LIKE '%$searching%' 

回答

0

達到的效果我追我跟着@RavinderReddy的建議。

我開始爆炸的方式串

$search_text = $_GET['userInput']; 
$searching = strtolower($search_text); 
$explode = explode(" ", $searching); 

我再檢查的內容,並將結果輸出

if($explode[0] != ''){ 
    $firstterm = $explode[0]; 
}else{ 
    $firstterm = '@@@'; 
} 
if($explode[1] != ''){ 
    $secondterm = $explode[1]; 
}else{ 
    $secondterm = '@@@'; 
} 
if($explode[2] != ''){ 
    $thirdterm = $explode[2]; 
}else{ 
    $thirdterm = '@@@'; 
} 
} 

我使用的各個爆「@@@」,因爲它永遠不會匹配我的任何數據。

最後,我修改了我的mysqli查詢以反映幷包含新的OR LIKE搜索項。

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

OR f_name LIKE '%$secondterm%' 
OR l_name LIKE '%$secondterm%' 
OR concat(f_name,l_name) LIKE '%$secondterm%' 

order by id LIMIT 5"); 

要考慮的事情是我已經建立了我的數據庫,以便所有條目都不包含任何空格。在展示我的數據時,爲了達到一致的目的,我已經這樣做了,並且讓用戶能夠按他們想要的方式「搜索」他們的搜索並仍然可以找到他們想要的結果。

我期待的下一步就是嘗試找到一種方法來通過匹配'id'的大量匹配字符'排序'。原因是如果我輸入'C Blogs'尋找'Craig Blogs','C'將因爲電子郵件地址'.Com'而對我的聯繫人的每個人都造成衝擊。

因此,如果我可以通過大量的匹配字符得到它,那麼最好的結果理論上應該是'Craig Blogs'。

注:我是這個網站的新手,也是回答我的問題的新手。如果格式不好,或者我已經解釋過多,我很抱歉。

0

使用Concat_ws: -

WHERE concat_ws(' ',k_name,f_name,l_name,phone...) LIKE '%$searching%' 
+0

在這種情況下,如果我輸入f_name然後l_name然後電話它的作品。但是,如果我輸入f_name然後輸入k_name或其他任何不按順序它不起作用。我正在尋找能夠涵蓋所有組合的解決方案。 – Bjaeg

+1

*** @ Bjaeg ***:不。如果你想使用*單個*搜索字符串來比較所有字段,那麼它必須具有*任意一個*'f_name'或'l_name'或'phone'或'etc_fld'值。如果您同時輸入('phone'和'f_name')或('email'和'l_name')類型的隨機組合作爲您的單個搜索字符串的一部分,則不起作用。如果你想要這樣的行爲,那麼你必須將搜索字符串拆分爲多個,並在查詢中使用* them *,並使用多個或更多個'like'組合。否則,'Rahautos'解決方案應該工作。 –

+0

@RavinderReddy感謝您進一步詳細解釋。 – Bjaeg