2009-11-27 33 views
2

我需要使用LIKE關鍵字或一些其他類似的運營商爲了這個目的:如何在MySQL中使用LIKE和任意字順序?

在數據庫中,姓名存儲爲一列,它的順序surname name(例如「李四約翰」)。

我有一個搜索欄讓你輸入你的姓名。當我要搜索時,如果您輸入name surname而不是surname name(例如,如果輸入「John Doe」),我仍然希望得到與您寫入surname name時相同的結果。

我該如何做到這一點?

+0

你想知道如何使用等,或者如何交換(姓名)(名姓) – 2009-11-27 13:07:38

+0

沒有其實我知道如何使用等。不過,我一開始以爲你可以用LIKE來做到這一點。因此,我想知道如何將姓氏名稱換成姓氏 – seedg 2009-12-01 14:17:33

回答

9

如果你的表是MyISAM,你可以創建一個FULLTEXT指數在兩個領域:

CREATE FULLTEXT INDEX ON mytable (name, surname) 

,併發出此查詢:

SELECT * 
FROM mytable 
WHERE MATCH(name, surname) AGAINST ('+John +Doe' IN BOOLEAN MODE) 

這將返回John DoeDoe John

MyISAM表上,即使沒有創建索引,該查詢也可以工作,但在這種情況下,它會慢得多。

更新:

,如果你有一個字段名和姓這會甚至工作:

CREATE TABLE t_name (id INT NOT NULL PRIMARY KEY, name VARCHAR(200) NOT NULL) ENGINE=MyISAM; 

INSERT 
INTO t_name 
VALUES 
(1, 'John Doe'), 
(2, 'Doe John'); 

SELECT * 
FROM t_name 
WHERE MATCH(name) AGAINST ('+John +Doe' IN BOOLEAN MODE); 

1, 'John Doe' 
2, 'Doe John' 

更新2:

InnoDB表,可以使用正則表達式:

SELECT * 
FROM t_name 
WHERE name RLIKE '[[:<:]]John[[:>:]]' 
     AND name RLIKE '[[:<:]]Doe[[:>:]]' 
+0

我沒有兩個字段。我只有一個名爲Name的字段,其中包含名稱和姓氏。這是我的問題... – seedg 2009-11-27 14:36:27

+0

克里斯,這個FULLTEXT選項適用於你的一個名稱列,很好。如果你的某些名字中有三個或更多的單詞,它也會起作用,比如「John Fitzgerald(Jack)Kennedy」 – 2009-11-27 17:45:58

+0

好的,那麼就試試這個。如果我成功了,會讓你知道。非常感謝! – seedg 2009-12-01 14:18:48

0
//in PHP 
//after filtering and validating name and surname 
$where = 'WHERE name = ' .$name. ' ' .$surname. ' OR name = ' .$surname. ' ' .$name; 

檢查兩者。

+0

是的,我知道該解決方案,但由於某些原因,在這一點上分裂名稱會很複雜。請記住,該名稱是包含名稱和姓氏的一個屬性。沒有辦法,你怎麼能直接從SQL做到這一點? – seedg 2009-11-27 13:10:15

+1

@Chris:你將不得不在某個時刻分裂這個名字。至少在這種情況下,它只是將輸入字符串拆分爲空白字符的問題。 – Welbog 2009-11-27 13:13:40

0
SELECT SUBSTRING_INDEX(name, ' ', -1) 
SUBSTRING_INDEX(name, ' ', 1) 

作爲計數(第3個變量)的負值返回空間右側的所有值。正值將所有內容都返回到左側。

這是假設您有一個單獨的字段,您可以在其中輸入兩個值。

0

您可以在空白處分割搜索輸入並分別搜索每個單詞。你必須編寫一個簡單的函數來生成語句。基本上,如果你搜索:

Luke Skywalker 

你會得到將是該語句:

SELECT * FROM `table` 
WHERE 
    (`name` LIKE "Luke%" OR `name` LIKE "Skywalker%") 
    AND 
    (`surname` LIKE "Luke%" OR `surname` LIKE "Skywalker%") 

如果有人搜索三個單詞(或只有一個字),你有三個(或者一個)每個字段的LIKE語句。如果您希望不那麼嚴格並且只需要其中一個詞匹配,請將AND替換爲OR

0

我不知道你在用什麼語言,但上下文/主要想法應該保持不變。 您可以添加2個文本框,名稱爲1,姓氏爲1。 然後,您應該使用一個LIKE查詢來按照該順序搜索您的文本框名稱和姓氏值。

編輯:

的第二種方式是分裂的文本框的內容,並將它們保存在2個單獨的字符串。 然後,使用這樣的尋找它:

SELECT * FROM <your table> WHERE names LIKE 'name1+" "+name2' OR WHERE names LIKE 'name2+" "+name1'; 
+0

我不認爲這是一個用戶友好的選項添加兩個字段。 (也許在高級搜索頁面) – erenon 2009-11-27 13:14:09

+0

這是正確的,它可能總是另一種方法來檢測是否有2個單詞鍵入到文本框中,將它們拆分並在查詢中使用OR在任一方向上搜索它們。 然後這個名字可以再由3個甚至4個字組成。 – Pieter888 2009-11-27 13:18:10

+0

有一些名稱包含2個姓名和2個姓氏。你將如何分割一個這樣的名字?名稱不一致。例如,你可能有一個名字john w doe,或者你可能有另一個名字john michael doe johns。如何分割這些呢? – seedg 2009-11-27 14:45:15

0

試試這個

原始數據:

Doe John 
Stack Overflow 
Pew Ned 

記錄搜索

declare @String2Search varchar(50) 
set @String2Search = 'John Doe' 

的Sql Sever的查詢

select name from @t 
where REPLACE(name,' ','') like '%' + REPLACE(@String2Search,' ','') + '%' 
OR 
SUBSTRING(name,CHARINDEX(' ',name),len(name)) + SUBSTRING(name,0,CHARINDEX(' ',name)) like '%' + REPLACE(@String2Search,' ','') + '%' 

MySQL查詢

select name from @t 
where REPLACE(name,' ','') like '%' + REPLACE(@String2Search,' ','') + '%' 
OR 

SUBSTRING(name,LOCATE(' ',name),LENGTH(name)) + SUBSTRING(name,0,LOCATE(' ',name)) like '%' + REPLACE(@String2Search,' ','') + '%' 

注意 - 我是一個SQL Server的傢伙。所以首先我寫在SQL Server查詢,然後我在谷歌檢查在MySQL中相應的功能等價和我剛剛更換那些

SQLSERVER ---------------------------------------------- MYSQL 



SUBSTRING() ------------Equivalent----------------------- SUBSTRING() 



CHARINDEX() ------------Equivalent----------------------- LOCATE() 


REPLACE() --------------Equivalent----------------------- REPLACE() 


LEN() --------------Equivalent----------------------- LENGTH() 

在SQL Server它工作正常。我實現了這個概念是我匹配從對名字和姓氏搜索文本字以及反向(姓&名)

我已經使用替換功能的charecters之間移除任何空格

這個語句(在SQL Server)

SUBSTRING(name,CHARINDEX(' ',name),len(name)) + SUBSTRING(name,0,CHARINDEX(' ',name)) 

OR

在MY SQL

SUBSTRING(name,LOCATE(' ',name),LENGTH(name)) + SUBSTRING(name,0,LOCATE(' ',name)) 

基本上將第一和姓氏,以姓氏後跟名字

希望你得到的概念,它可以幫助你。

1

試試這個:

SELECT * 
FROM t_name 
WHERE name LIKE '%john%' AND name LIKE '%doe%'; 
0
SQL = "Select * From T_Name " & GetSuperWhere("Name", "John Smith") 


Private Function GetSuperWhere(FieldName As String, Words As String) As String 
    Dim X() As String 
    Dim Where As String = "" 
    'sample: GetSuperWhere('Name', 'John Smith') -> Return: 
    ' " WHERE Name Like '%John%' AND Name Like '%Doe%'" 


    X = Words.Split(" ") 
    For Each Word As String In X 
     If Where <> "" Then Where = Where & " AND " 
     Where = Where & FieldName & " Like '%" & Word & "%'" 
    Next 


    If Where <> "" Then Where = " WHERE " & Where 


    Return Where 
End Function