поиск с именем в базе данных для человека - MySQL - PullRequest
2 голосов
/ 05 апреля 2011

В своей таблице я храню имя в столбце fName и фамилию в столбце lName, теперь мне нужно искать их с помощью запроса, но я не знаю SQL!

пример

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

Пользователь должен получить MAHENDRA SINGH DHONI, если он ищет Махендру Дони!

Ответы [ 4 ]

2 голосов
/ 05 апреля 2011
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 голос
/ 05 апреля 2011

Вам не ясны природа поисковых запросов и, в частности, уровень гибкости. Во-первых, пользователю дается два поля для имени и фамилии или только одно поле поиска? Если первое, то быстрое решение будет:

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, в вашем поиске? Просто слишком много крайних случаев для того, чтобы это работало ИМО. Правильное решение - получить механизм полнотекстового индексирования, такой как Lucene, который будет создавать индекс по обоим столбцам и оценивать качество соответствия.

Lucene

0 голосов
/ 05 апреля 2011

Я предполагаю, что ваши входные данные взяты из двух разных текстовых полей, и, надеюсь, вы используете хранимую процедуру:).

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 поле ввода, вам нужно разделить поисковый термин на пробел и зациклить его по столбцам fname и lname, используя аналогичный синтаксис «% term%».

Другим способом было бы создать хранимую процедуру, которая бы добавляла fname и lname вместе и выполняла сопоставление soundex. Здесь вы сравниваете поисковый запрос со звуком слова в таблице. Google это должно помочь, это довольно легко.

0 голосов
/ 05 апреля 2011

Я предполагаю, что у вас есть 2 входа, и вы получаете только часть имени.Если это так, тогда будет работать следующее:

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

Преимущество этого подхода состоит в том, что он будет использовать индексы столбцов или объединенный индекс, тогда как запросы like всегда выполняются полностьюсканирование таблиц.

Вы также можете воспользоваться поисковой системой, такой как sphinx или solr, если вы действительно не знаете, какие данные вы получаете, поскольку они гораздо более гибкие, чем запросы к базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...