我有一個列名爲的用戶表名和姓氏。在兩個MySQL列中搜索關鍵字
SELECT *
FROM users
WHERE first_name LIKE '%keywords%'
OR last_name LIKE '%keywords%'
使用上述,如果我搜索「約翰」或「Doe」我會得到一擊。
但是如果我搜索「John Doe」,我會得到0個結果。我如何以匹配「first_name last_name」的方式搜索MySQL,而不僅僅是一個或另一個?
我有一個列名爲的用戶表名和姓氏。在兩個MySQL列中搜索關鍵字
SELECT *
FROM users
WHERE first_name LIKE '%keywords%'
OR last_name LIKE '%keywords%'
使用上述,如果我搜索「約翰」或「Doe」我會得到一擊。
但是如果我搜索「John Doe」,我會得到0個結果。我如何以匹配「first_name last_name」的方式搜索MySQL,而不僅僅是一個或另一個?
一種解決方案是在應用程序中分裂的關鍵字,然後生成查詢,如下所示:
-- 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_name
和last_name
上的索引。更好的方法是使用Full Text indexing。
嘗試:
SELECT * FROM users WHERE CONCAT(first_name, ' ', last_name) LIKE '%keywords%';
很好,但是如果存在'first_name'或'last_name'列,則不能使用索引,除了在左側使用'LIKE'和通配符。 – 2010-02-03 02:44:19
您是否嘗試過使用full-text indexing?
Ehm - 爲什麼要提供完全相同的鏈接@Daniel Vassallo在6天前發佈的答案上面提供了4釐米以上的答案(如果您按照最早排序,稍後按最新排序)? – scherand 2010-03-31 18:42:27
@Daniel Vassallo以一種完全不同的方式開始了他的回答後,我想我一定錯過了。 – 2010-04-08 22:12:24
你僅限於使用一個變量嗎? – 2010-02-03 03:14:43
變量是從搜索字段輸入的,所以它可能只是一個單詞或可能是兩個(名字和姓氏)。 – Jeff 2010-02-10 15:00:12