在数据库中使用名称搜索个人-MySQL
在我的表中,我在在数据库中使用名称搜索个人-MySQL,mysql,sql,Mysql,Sql,在我的表中,我在fName列中存储名字,在lName列中存储姓氏,现在我需要用查询来搜索它们,但我不知道SQL 范例 lName | fName ----------------- Tendulkar| Sachin Ganguly | Sourav Khan | Zaheer Dhoni | Mahendra Singh 如果用户搜索MAHENDRA DHONI,则应获得MAHENDRA SINGH DHONI select concat(fNa
fName
列中存储名字,在lName
列中存储姓氏,现在我需要用查询来搜索它们,但我不知道SQL
范例
lName | fName
-----------------
Tendulkar| Sachin
Ganguly | Sourav
Khan | Zaheer
Dhoni | Mahendra Singh
如果用户搜索MAHENDRA DHONI,则应获得MAHENDRA SINGH DHONI
select concat(fName,' ',lName) fullname
from tbl
where concat(' ',fName,' ',lName,' ') like '% Mahendra %'
and concat(' ',fName,' ',lName,' ') like '% dhoni %'
这无疑会让任何关于查询性能良好的希望化为乌有
主题的变化
select concat(fName,' ',lName) fullname
from tbl
where (concat(fName,' ',lName) like '%Mahendra%dhoni%'
or concat(lName,' ',fName) like '%Mahendra%dhoni%')
第二个版本不关心完整的部件匹配,例如,dhoni将匹配Madonie
这两个查询都能正确找到名称。请注意,要匹配的名称前后都有%,名称中的每个空格都有%
create table tbl (fname varchar(100), lname varchar(100));
insert tbl select 'Mahendra singh', 'dhoni';
select concat(fName,' ',lName) fullname
from tbl
where (concat(fName,' ',lName) like '%Mahendra%dhoni%'
or concat(lName,' ',fName) like '%Mahendra%dhoni%');
select concat(fName,' ',lName) fullname
from tbl
where (concat(fName,' ',lName) like '%dhoni%Mahendra%'
or concat(lName,' ',fName) like '%dhoni%Mahendra%');
我假设你有2个输入,你只得到名字的一部分。如果这是真的,那么以下操作将起作用:
select concat(fname, ' ', lname)
from yourtable
where substring(fname, 1, 5) = 'mahen'
and lname = 'dhoni'
这种方法的优点是,它将使用列上的索引或组合索引,而像这样的查询总是进行全表扫描
当您确实不知道所接收的数据时,您也可以使用sphinx或solr之类的搜索引擎,因为这些搜索引擎比数据库查询灵活得多。您不清楚搜索输入的性质,特别是灵活程度。首先,是为用户提供了两个名和姓框,还是只提供了一个搜索框?如果是前者,则快速解决方案为:
Select concat( fname, ' ', lname)
From MyTable
Where lname Like 'dhoni%'
And fname Like 'mahendra%'
上述查询仅搜索列值的第一部分以搜索值开头的位置。但是,如果用户可以在单个搜索框中键入任何内容,那么就更难了。如果假定用户键入了空格
,那么解决用户只输入两个单词的特定问题的一个解决方案是在空格上拆分并运行如下操作:
Select concat( fname, ' ', lname)
From MyTable
Where ( lname Like '%dhoni%' And fname Like '%mahendra%' )
Or ( lname Like '%mahendra%' And fname Like '%dhoni%' )
但是,该查询将执行得非常糟糕,因为它迫使系统在每次执行时扫描整个表。此外,当他们在搜索中输入由三部分组成的名称(如Mahendra Singh Dhoni
)时会发生什么?对于这一点,在IMO中有太多的边缘情况是不可行的。正确的解决方案是获得一个像Lucene这样的全文索引引擎,它将在两列之间创建索引,并对匹配的质量进行排序
我猜您的输入来自两个不同的文本框,希望您使用的是存储过程:)
如果您有一个输入框,您将希望按空格分割搜索项,并使用类似的“%term%”语法针对fname和lname列循环搜索项
另一种方法是创建一个存储过程,将fname和lname添加在一起并进行soundex匹配。这是您将搜索词与表中单词的发音进行匹配的地方。谷歌it应该会有所帮助,这很简单。如果我搜索Mahendra Dhoni,你的查询会起作用,但如果我搜索Dhoni Mahendra,你的查询会失败。我需要建立一个类似Facebook、orkut这样的个人搜索功能,用户可以用姓氏或姓氏进行搜索,我想你能帮上忙!我不知道,但它对Mahendra Dhoni非常有效,但对Dhoni Mahendra[返回空结果集]@Richard aka cyberkiwi不,先生,同样的问题也会发生:(我需要编写一个SQL,为比尔·盖茨和盖茨·比尔返回相同的结果[就像Facebook orkut那样]@Sourav/我仔细检查并测试了它定义搜索“mahendra dhoni”?这是否意味着您知道具体的姓氏?这是否意味着您只知道用户的完整字符串?这是否意味着您同时拥有名字和姓氏?如果您阅读我的答案下的注释,您将看到OP想要的正是他想要的-而不是一些精简的子字符串“开头“搜索,当然不必在姓/名之间做出决定(搜索应该是双向的)。在相同的限制条件下,请告诉我何时可以更好地查询。我不知道Facebook,但如果你在Orkut搜索“ary”,你会得到类似“D!NE$#C#aud#ary”的匹配。”@Richard First off我清楚地解释了我的解决方案的参数,这很好,但无论如何还是要感谢投票否决。真正的解决方案是一个搜索引擎,就像我说的那样,如果你在数据库中有一个跨多个列的字符串。你对Orkut的观点是什么?如果数据在顺便说一句,db?@greg给我一个技术上的理由来解释为什么这是一个糟糕的答案?@wes/如果你采取重新定义需求的方法,直到你能简单地回答它…那么你有一个有趣的方法。我关于Orkut的观点(我想我很清楚)它对名字和姓氏中的任何一个都执行包含搜索,而不仅仅是其中一个的开头。不仅如此,子字符串也不会使用索引,但就像“mahen%”一样,您的第二个查询会工作,并且您要写的是,对于3个或更多的单词,sql会被破坏:(我正在用PHP/MySQL构建一个类似facebook orkut的搜索功能,你能帮我吗?@Sourav-解决方案是一个搜索引擎。请记住,你假设一个空格作为单词分隔符。可能有连字符、撇号等。此外,还应该注意,在名称的背面进行搜索可能并不总是正确的t、 你可能会遇到这样一种情况,“Smyth Bob”是一个独立于“Bob Smyth”的人。一个提供排名的搜索引擎是正确的解决方案。
declare @input1 nvarchar(50)
declare @input2 nvarchar(5)
set @input1 = 'Mahendra'
set @input2 = 'Dhoni'
select upper((fname + ' ' + lname)) as 'FullName'
from customer
where fname like '%' + @input1 + '%'
or fname like '%' + @input1 + '%'
or lname like '%' + @input2 + '%'
or lname like '%' + @input2 + '%'