我需要使用LIKE
關鍵字或一些其他類似的運營商爲了這個目的:如何在MySQL中使用LIKE和任意字順序?
在數據庫中,姓名存儲爲一列,它的順序surname name
(例如「李四約翰」)。
我有一個搜索欄讓你輸入你的姓名。當我要搜索時,如果您輸入name surname
而不是surname name
(例如,如果輸入「John Doe」),我仍然希望得到與您寫入surname name
時相同的結果。
我該如何做到這一點?
我需要使用LIKE
關鍵字或一些其他類似的運營商爲了這個目的:如何在MySQL中使用LIKE和任意字順序?
在數據庫中,姓名存儲爲一列,它的順序surname name
(例如「李四約翰」)。
我有一個搜索欄讓你輸入你的姓名。當我要搜索時,如果您輸入name surname
而不是surname name
(例如,如果輸入「John Doe」),我仍然希望得到與您寫入surname name
時相同的結果。
我該如何做到這一點?
如果你的表是MyISAM
,你可以創建一個FULLTEXT
指數在兩個領域:
CREATE FULLTEXT INDEX ON mytable (name, surname)
,併發出此查詢:
SELECT *
FROM mytable
WHERE MATCH(name, surname) AGAINST ('+John +Doe' IN BOOLEAN MODE)
這將返回John Doe
和Doe 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[[:>:]]'
//in PHP
//after filtering and validating name and surname
$where = 'WHERE name = ' .$name. ' ' .$surname. ' OR name = ' .$surname. ' ' .$name;
檢查兩者。
SELECT SUBSTRING_INDEX(name, ' ', -1)
SUBSTRING_INDEX(name, ' ', 1)
作爲計數(第3個變量)的負值返回空間右側的所有值。正值將所有內容都返回到左側。
這是假設您有一個單獨的字段,您可以在其中輸入兩個值。
您可以在空白處分割搜索輸入並分別搜索每個單詞。你必須編寫一個簡單的函數來生成語句。基本上,如果你搜索:
Luke Skywalker
你會得到將是該語句:
SELECT * FROM `table`
WHERE
(`name` LIKE "Luke%" OR `name` LIKE "Skywalker%")
AND
(`surname` LIKE "Luke%" OR `surname` LIKE "Skywalker%")
如果有人搜索三個單詞(或只有一個字),你有三個(或者一個)每個字段的LIKE語句。如果您希望不那麼嚴格並且只需要其中一個詞匹配,請將AND
替換爲OR
。
我不知道你在用什麼語言,但上下文/主要想法應該保持不變。 您可以添加2個文本框,名稱爲1,姓氏爲1。 然後,您應該使用一個LIKE查詢來按照該順序搜索您的文本框名稱和姓氏值。
編輯:
的第二種方式是分裂的文本框的內容,並將它們保存在2個單獨的字符串。 然後,使用這樣的尋找它:
SELECT * FROM <your table> WHERE names LIKE 'name1+" "+name2' OR WHERE names LIKE 'name2+" "+name1';
我不認爲這是一個用戶友好的選項添加兩個字段。 (也許在高級搜索頁面) – erenon 2009-11-27 13:14:09
這是正確的,它可能總是另一種方法來檢測是否有2個單詞鍵入到文本框中,將它們拆分並在查詢中使用OR在任一方向上搜索它們。 然後這個名字可以再由3個甚至4個字組成。 – Pieter888 2009-11-27 13:18:10
有一些名稱包含2個姓名和2個姓氏。你將如何分割一個這樣的名字?名稱不一致。例如,你可能有一個名字john w doe,或者你可能有另一個名字john michael doe johns。如何分割這些呢? – seedg 2009-11-27 14:45:15
試試這個
原始數據:
名
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 SQLSUBSTRING(name,LOCATE(' ',name),LENGTH(name)) + SUBSTRING(name,0,LOCATE(' ',name))
基本上將第一和姓氏,以姓氏後跟名字
希望你得到的概念,它可以幫助你。
試試這個:
SELECT *
FROM t_name
WHERE name LIKE '%john%' AND name LIKE '%doe%';
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
你想知道如何使用等,或者如何交換(姓名)(名姓) – 2009-11-27 13:07:38
沒有其實我知道如何使用等。不過,我一開始以爲你可以用LIKE來做到這一點。因此,我想知道如何將姓氏名稱換成姓氏 – seedg 2009-12-01 14:17:33