在数据库中搜索一个人的名字 - MySQL

时间:2011-04-05 03:20:05

标签: mysql sql

在我的表中,我将fName列中的第一个名称和lName列中的姓氏存储起来,现在我需要使用查询搜索它们,但我不知道SQL!< / p>

例如

   lName | fName  
-----------------
Tendulkar| Sachin   
Ganguly  | Sourav   
Khan     | Zaheer  
Dhoni    | Mahendra Singh  

如果他搜索Mahendra Dhoni,用户应该获得MAHENDRA SINGH DHONI!

4 个答案:

答案 0 :(得分:2)

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将匹配madhonie


这两个查询都正确找到了名称。请注意,要匹配的名称前后有%,以及名称中每个空格的%。

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%');

答案 1 :(得分:1)

您不清楚搜索输入的性质,特别是灵活程度。首先,用户是第一个和最后一个名称还是只有一个搜索框?如果是前者,那么快速解决方案将是:

Select concat( fname, ' ', lname)
From MyTable
Where lname Like 'dhoni%'
    And fname Like 'mahendra%'

上述查询仅搜索列值的第一部分以搜索值开头的位置。但是,如果用户可以在单个搜索框中键入任何内容,则更难。如果假定用户键入了<name part> space <name part>,则解决该用户只输入两个单词的特定问题的一个解决方案是拆分该空间并执行如下操作:

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这样的全文索引引擎,它将在两个列上创建索引并对匹配的质量进行排名。

Lucene

答案 2 :(得分:0)

我猜你的输入来自两个不同的文本框,希望你使用的是存储过程:)。

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 + '%'

如果您有1个输入框,则需要按空格分割搜索词,并使用类似'%term%'的语法在fname和lname列上循环搜索词。

另一种方法是创建一个将fname和lname加在一起并执行soundex匹配的存储过程。这是您将搜索词与表格中单词的声音相匹配的位置。谷歌应该有所帮助,非常简单。

答案 3 :(得分:-1)

我假设您有2个输入,而您只是获得名字的一部分。如果这是真的,那么以下方法将起作用:

select concat(fname, ' ', lname)
  from yourtable
 where substring(fname, 1, 5) = 'mahen'
   and lname = 'dhoni'

这种方法的优点是它将使用列上的索引或组合索引,而like查询始终执行全表扫描。

当你真的不知道你收到的数据时,你也可以查看像sphinx或solr这样的搜索引擎,因为它们比数据库查询更灵活。