Крис,
Я думаю, что суть вашей проблемы в том, что ваша логика в настоящее время говорит: «Покажите мне все записи, где FirstName или LastName соответствуют одному из слов в строке поиска». Вы позволяете кому-то искать «Мэтью Марк Люк Джон» как строку, чтобы найти людей с ЛЮБЫМИ из этих имен, вместо того, чтобы рассматривать поисковое слово только как одно имя.
Это вызывает тот факт, что запись 'Steve Jobs' появляется для поиска = 'Steve Smith' из-за совпадения только по firstName. Похоже, логика SQL слишком широка.
Звучит так, будто вы хотите, чтобы поиск вместо этого обрабатывал строку как полное имя (имя + фамилия), а не как список из нескольких имен для сравнения. Однако, если предоставляется более одного слова, вы хотите быстро сузить записи, которые соответствуют ВСЕМ словам, не ЛЮБИМЫМ.
Имена могут быть сложными, с именем или фамилией, состоящим из нескольких слов. Это представляет некоторые незначительные трудности.
Желаемый результат:
- Поиск "Аллен" - воспитывать записи
с именем или фамилией Аллена
- Поиск "Аллен Смит" воспитывает записи
с обоими именами и фамилиями
против "Аллена" и / или "Смита"
Этот запрос разрешит любое количество слов в строке поиска, но покажет только записи, которые соответствуют каждому слову тем или иным способом (позволяет искать имена в любом порядке, например, «Первый, Последний» или «Последний»). Это, вероятно, то, что вы хотите.
SELECT idn, firstname, lastname
FROM Employees
WHERE 1=1
<cfloop list="#arguments.nameSearchString#" delimiters=" " index="word">
AND ( firstname like <cfqueryparam cfsqltype="cf_sql_varchar" value="#word#%" />
OR lastname like <cfqueryparam cfsqltype="cf_sql_varchar" value="#word#%" /> )
</cfloop>