2008-11-19 120 views
32

我想搜索我的表有一列名字和一列姓氏。我目前接受來自現場搜索詞,它在時間在WHERE子句中使用mysql concat()?

select * from table where first_name like '%$search_term%' or 
    last_name like '%$search_term%'; 

這正常工作與單個詞的搜索字詞但結果集包括每個人的名稱爲「拉里」與之比較的兩列,一個。但如果有人輸入名字,然後是空格,然後是姓,我想要一個更窄的搜索結果。我試過以下沒有成功。

select * from table where first_name like '%$search_term%' or last_name 
    like '%$search_term%' or concat_ws(' ',first_name,last_name) 
    like '%$search_term%'; 

有什麼建議嗎?

編輯:我測試的名字是「拉里史密斯」。 db在「first_name」列中存儲「Larry」,在「last_name」列中存儲「Smith」。數據很乾淨,沒有額外的空間,搜索詞左右裁剪。

編輯2:今天早上我試了羅伯特寶寶的答案。他和我昨晚的跑步非常相似。我無法解釋它,但今天早上它可以工作。我能想到的唯一區別就是昨天晚上我將concat函數作爲我的搜索查詢的第三個「或」段(在查看first_name和last_name之後)運行。今天早上,我在查看以上內容以及地址和商業名稱後,將其作爲最後一部分。

在查詢結束時運行mysql函數是否比中間運行得更好?

+0

我只是跑你遇到問題的版本,它爲我工作得很好。 – 2008-11-20 13:12:43

回答

66

你應該工作什麼,但可以簡化爲:

select * from table where concat_ws(' ',first_name,last_name) 
like '%$search_term%'; 

你能提供一個例子名稱和搜索字詞,其中這不起作用?

+0

我同意,我跑了這個,它的行爲和你期望的一樣...... – 2008-11-19 23:50:41

+0

這個語法或類似的東西是否支持所有數據庫?它在SQL標準中提到過嗎? – 2011-01-08 05:26:51

+0

有沒有這樣做的方法,儘管在所有數據庫中都有所不同? – 2011-01-08 05:46:28

2
SELECT *,concat_ws(' ',first_name,last_name) AS whole_name FROM users HAVING whole_name LIKE '%$search_term%' 

...可能是你想要的。

1

有幾件事情可能會影響到您的數據是否乾淨?

這可能是你的第一個名字字段的結尾有空格,然後意味着你有名字和姓氏之間的兩個空格當你Concat的呢?使用trim(first_name)/ trim(last_name)可以解決這個問題 - 儘管真正的解決方法是更新數據。

你也該給,但符合其中兩個詞都出現不一定在一起(假設你是在PHP - 其中$ SEARCH_TERM變量表明你是)

$whereclauses=array(); 
$terms = explode(' ', $search_term); 
foreach ($terms as $term) { 
    $term = mysql_real_escape_string($term); 
    $whereclauses[] = "CONCAT(first_name, ' ', last_name) LIKE '%$term%'"; 
} 
$sql = "select * from table where"; 
$sql .= implode(' and ', $whereclauses); 
9

注意,搜索查詢是目前情況下,敏感。

當使用

SELECT * FROM table WHERE `first_name` LIKE '%$search_term%' 

將同時匹配 「拉里」 和 「拉里」。有了這個concat_ws,它會突然變得區分大小寫!

這可以通過固定使用以下查詢:

SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', `first_name`, `last_name`) LIKE UPPER('%$search_term%') 

編輯:請注意,非二進制元素這隻作品。另見mynameispaulie's answer

1

你可以做到這一點(在MySQL的工作)可能還有其它SQL太.. 只是試試這個:

select * from table where concat(' ',first_name,last_name) 
    like '%$search_term%'; 
4

呂克:

我與你的答案同意,雖然我想補充UPPER僅適用於非二進制元素。如果您正在處理年齡列(或任何數字),則需要執行CAST轉換才能使UPPER功能正常工作。

SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', first_name, last_name, CAST(age AS CHAR)) LIKE UPPER('%$search_term%'); 

原諒我沒有直接回應Luc的回答,但對於我的生活我無法弄清楚如何做到這一點。如果管理員可以移動我的帖子,請這樣做。

-1

你可以試試這個:

select * FROM table where (concat(first_name, ' ', last_name)) = $search_term;