2014-04-29 69 views
3

這是一種簡單但不是在同一時間。試圖縮短否則懶惰的查詢

我有一個用戶放入名稱的基本搜索框。 僅由first_namelast_name組成的名稱。 表有列first_namelast_namedisplay_name其中firs_namelast_name顯然什麼姓和名,並display_namefirst_namelast_name無論是串聯還是首選名稱,以便William Smith可能有Bill Smith的顯示名稱。

的wackyness:

兩個姓和名可以是雙名。我的意思是,我們可能會像

First Name: Anna Maria Last Name: Smith 
First Name: Anna   Last Name: Bo Johnson 
First Name: Anna Maria Last Name: Bo Johnson. 

命名,那麼最好的情況下,一個名稱爲Anna Smith,但我有足夠的最壞的情況Anna Maria Bo Johnson不得不這樣做。

Anna Maria Bo Johnson用戶搜索我需要運行一個查詢,其中4個「字」是第一個或最後一個名字,而黯然雙第一雙姓氏有84個組合的類似Anna Bo Maria Johnson這是不知道,還是Bo Maria Johnson Anna等等......

現在我的問題是,我不希望我的MySQL查詢爲84線長是這樣的:(3個字的名字爲例)

SELECT * FROM tablename a 
WHERE 
    (a.first_name = '$search_term[0]' AND a.last_name = '$search_term[1]') OR  
    (a.first_name = '$search_term[0]' AND a.last_name = '$search_term[2]') OR   
    (a.first_name = '$search_term[0]' AND a.last_name = '$search_term[1] $search_term[2]') OR 
    (a.first_name = '$search_term[0]' AND a.last_name = '$search_term[2] $search_term[1]') OR 
    (a.first_name = '$search_term[1]' AND a.last_name = '$search_term[0]') OR 
    (a.first_name = '$search_term[1]' AND a.last_name = '$search_term[1]') OR  
    (a.first_name = '$search_term[1]' AND a.last_name = '$search_term[0] $search_term[2]') OR 
    (a.first_name = '$search_term[1]' AND a.last_name = '$search_term[2] $search_term[0]') OR 
    (a.first_name = '$search_term[2]' AND a.last_name = '$search_term[0]') OR 
    (a.first_name = '$search_term[2]' AND a.last_name = '$search_term[1]') OR 
    (a.first_name = '$search_term[2]' AND a.last_name = '$search_term[0] $search_term[1]') OR 
    (a.first_name = '$search_term[2]' AND a.last_name = '$search_term[1] $search_term[0]') OR 
    (a.first_name = '$search_term[0] $search_term[1]' AND a.last_name = '$search_term[2]') OR 
    (a.first_name = '$search_term[1] $search_term[0]' AND a.last_name = '$search_term[2]') OR 
    (a.first_name = '$search_term[0] $search_term[2]' AND a.last_name = '$search_term[1]') OR 
    (a.first_name = '$search_term[2] $search_term[0]' AND a.last_name = '$search_term[1]') OR 
    (a.first_name = '$search_term[1] $search_term[2]' AND a.last_name = '$search_term[0]') OR 
    (a.first_name = '$search_term[2] $search_term[1]' AND a.last_name = '$search_term[0]') OR 
    a.display_name = '$search_term[0] $search_term[1] $search_term[2]' OR 
    a.display_name = '$search_term[1] $search_term[2] $search_term[0]' OR 
    a.display_name = '$search_term[2] $search_term[1] $search_term[0]' 
ORDER BY last_name, first_name ASC 

那麼,什麼將是一個不錯的快速,更高效寫出這個查詢的方式。基本上我需要比較(=)每個單詞與隨機單個單詞中的所有字段或兩個字組合組。

感謝您提前提供任何幫助!

+0

In情況並不明顯$ search_term []是通過使用explode()分割搜索詞「Anna Maria Bo Johnson」創建的一個數組(可能是) – ipixel

+0

您可以使用'LIKE'運算符(http://www.w3schools.com /sql/sql_like.asp),但你會得到多個結果。搜索的重點是否只提供一個結果? –

+0

我有一個單獨的查詢,它使用LIKE和AND NOT FIELD IN(SELECT字段FROM ...),除了「確切」搜索結果,它給了我一切。 – ipixel

回答

1

使用IN聲明:

SELECT * 
FROM tablename a 
WHERE concat_ws(' ',a.first_name,a.last_name) IN ('John Smith','Samantha Rose') 
+0

所以我只是列出了所有的變化到IN()部分。 – ipixel

+0

是的,concat_ws語句允許創建一個字符串,其中包含您的數據庫中的名字和姓氏,以便與IN語句中描述的條件進行比較。 – sdespont

+0

這很有意義。我會放棄這個希望取得一些穩固的結果。 – ipixel

0

我對你要配什麼有點混亂。看看你有的問題,看起來你會匹配瑪麗亞博約翰遜甚至博安娜。這是打算嗎?

如果是這樣,你能不能做

SELECT * FROM tablename a WHERE 
(a.first_name = '$search_term[0]' OR a.first_name = '$search_term[1]' OR 
a.first_name = '$search_term[2]' OR a.first_name = '$search_term[3]') 
AND 
(a.last_name = '$search_term[0]' OR a.last_name = '$search_term[1]' OR 
a.last_name = '$search_term[2]' OR a.last_name = '$search_term[3]') 

(可能增加一個檢查FIRST_NAME!=姓氏...)

+0

是的,因爲有太多的變化。該查詢不能假定安娜瑪麗亞是第一個名字,必須把它們當作名字或姓氏的一部分。 – ipixel

0

不要爆炸,但在MySQL concatenise

where concat(a.first_name, ' ', a.last_name) = '$search_terms' or a.display_name = '$search_terms' 

和使用一樣,如果輸入的可能只是一個名稱的一部分:如果你害怕人們有時開始

where concat(a.first_name, ' ', a.last_name) LIKE '%$search_terms%' or a.display_name LIKE '%$search_terms%' 

編輯姓氏,有時帶名字,再加上1個條件:

where concat(a.first_name, ' ', a.last_name) = '$search_terms' or concat(a.last_name, ' ', a.first_name) = '$search_terms' or a.display_name = '$search_terms' 
+0

但是,這會嘗試所有的變化? 安娜瑪麗亞博約翰遜, 安娜博瑪麗亞約翰遜, 安娜約翰遜波瑪利亞, 瑪麗亞安娜約翰遜博, 等... – ipixel

+0

爲什麼有人會搜索錯誤的順序名稱? –

+0

我是歐洲人,我們傾向於將人稱爲姓氏,名字,因此哈比人的力量可能會導致像約翰遜安娜這樣的搜索,所以我只是採取預防措施。 – ipixel