2010-02-03 58 views
1

我有一個列名爲的用戶表名姓氏在兩個MySQL列中搜索關鍵字

SELECT * 
    FROM users 
WHERE first_name LIKE '%keywords%' 
    OR last_name LIKE '%keywords%' 

使用上述,如果我搜索「約翰」或「Doe」我會得到一擊。

但是如果我搜索「John Doe」,我會得到0個結果。我如何以匹配「first_name last_name」的方式搜索MySQL,而不僅僅是一個或另一個?

+0

你僅限於使用一個變量嗎? – 2010-02-03 03:14:43

+0

變量是從搜索字段輸入的,所以它可能只是一個單詞或可能是兩個(名字和姓氏)。 – Jeff 2010-02-10 15:00:12

回答

1

一種解決方案是在應用程序中分裂的關鍵字,然後生成查詢,如下所示:

-- Split "John Doe" -> "John", "Doe" 

SELECT * FROM users WHERE 
(
    (
     first_name LIKE '%keyword_1%' OR 
     last_name LIKE '%keyword_1%' 
    ) 
    AND 
    (
     first_name LIKE '%keyword_2%' OR 
     last_name LIKE '%keyword_2%' 
    ) 
) 

以上也能匹配「李四喬」,不只是「Joe Doe」。如果要搜索更多列,這將變得更大,因爲您必須爲每個關鍵字添加「AND塊」。

此外,這帶來了很大的性能成本,因爲如果有任何這樣的查詢不能使用first_namelast_name上的索引。更好的方法是使用Full Text indexing

0

嘗試:

SELECT * FROM users WHERE CONCAT(first_name, ' ', last_name) LIKE '%keywords%'; 
+0

很好,但是如果存在'first_name'或'last_name'列,則不能使用索引,除了在左側使用'LIKE'和通配符。 – 2010-02-03 02:44:19

0

您是否嘗試過使用full-text indexing

+0

Ehm - 爲什麼要提供完全相同的鏈接@Daniel Vassallo在6天前發佈的答案上面提供了4釐米以上的答案(如果您按照最早排序,稍後按最新排序)? – scherand 2010-03-31 18:42:27

+0

@Daniel Vassallo以一種完全不同的方式開始了他的回答後,我想我一定錯過了。 – 2010-04-08 22:12:24