2013-01-13 137 views
0

好的,我有一個名爲players的數據庫表,每個玩家都有姓和名。然後我有一個我稱之爲搜索玩家的PHP Ajax搜索。例如...在輸入框中,有人鍵入James,表中有一行,名稱和姓氏分別爲JamesSmithMySQL搜索姓氏和姓

我這樣做$check = mysql_query("SELECT * FROM球員WHERELIKE '%$name%' OR用的名字LIKE '%$name%' LIMIT 0, 10") or die(mysql_error());

而且它無論是名字或姓氏like關鍵字James返回至少10個。但是,如果我輸入James Smith,儘管它在表格中,我會得到零結果。

我該如何解決這個問題?

回答

1

你使用的是InnoDB或MyISAM數據?如果您使用MyISAM,則可以創建一個包含組合名稱的字段,然後使用全文索引進行搜索。所以,讓我們想象一下,你添加一個新的領域被稱爲combined_names你會搜索像這樣

SELECT * FROM table WHERE match(combined_names) against('John Smith'); 

這將找到任何一行,無論是約翰和史密斯,你可以改變它與你想補充兩個部分只匹配的行加分,像這樣:

SELECT * FROM table WHERE match(combined_names) against('+John +Smith'); 

這裏是關於MySQL的站點上的文檔,你可以找到更多信息:

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

+0

但是..字段'combined_names'不需要在裏面搜索數據它? – nn2

+0

嗯,是的,你需要在你的代碼或觸發器中填充它。這是否重複數據....是的,但有時重複的數據是獲得搜索性能的最佳方式。您可以使用其他代碼解決方案來分割字符串並執行一些操作等,在應用程序中有一個固定數量的併發症,您的選擇就是放置它的地方:)。 –

+0

啊,好的。我知道了謝謝。 – nn2

1

分裂名字了對空間,以便查詢運行兩次(如果有一個空格)

查詢會爲這兩個名字

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

運行每件$ nameBits

查詢運行
surname LIKE '%$nameBits[$i]%' 
2
SELECT * FROM players WHERE CONCAT(forename, ' ', surname) = '$name' OR forename LIKE '%$name%' OR surname LIKE '%$name%' 
+0

這是一件好事。謝謝。然而,它似乎只有當我鍵入'約翰史密斯'... ...作爲(因爲我在做阿賈克斯搜索和按鍵)搜索'約翰史密斯'返回0 ... – nn2

+0

然後只是做一個喜歡:' CONCAT(forename,'',姓氏)LIKE'%$ name%''。或者,爲了獲得更好的數據庫性能,'CONCAT(forename,',surname)LIKE'$ name%''(假設你正在使用索引) – Peter