С некоторой изобретательностью MySQL будет делать то, что вам нужно ... Далее дается несколько идей, как этого можно достичь.
Your table: (I call it tblPersons)
PersonID (primary key of sorts)
First
Last
Middle
Maiden
Nick
Other columns for extra info (address, whatever...)
Сохраняя таблицу как есть и создавая индекс для каждого столбца, связанного с именем, следующий запрос предоставляет неэффективный, но правдоподобный способ найти всех людей, чье имя совпадает с каким-то образом конкретным именем , (Джек в примере)
SELECT * from tblPersons
WHERE First = 'Jack' OR Last = 'Jack' OR Middle = 'Jack'
OR Maiden = 'Jack' OR Nick = 'Jack'
Обратите внимание, что приложение не ограничивается поиском только одного значения имени для поиска во всех различных типах имен. Пользователь также может ввести определенный набор критериев, например, для поиска имени «Джон» и фамилии «Леннон» и профессии «художник» (если такая информация хранится в БД) и т. Д.
Кроме того, обратите внимание, что даже при таком подходе к одной таблице одна из возможностей вашего приложения может заключаться в том, чтобы позволить пользователю сообщать логике поиска, является ли это «заданным» именем (как у Павла, Саманты или Фатима) или «фамилия» (например, Блэк, МакКуин или Дюпон). Основная цель этого заключается в том, что существуют имена, которые могут быть либо (например, Льюис или Хиллари), и, будучи опционально немного более точными в своем запросе, конечные пользователи могут получить SQL для автоматического отсеивания многих не относящихся к делу записей , Мы вернемся к такого рода функциям в контексте альтернативного, более эффективного макета базы данных.
Представляем таблицу имен.
Вместо (или в дополнение ...) хранения различных имен в таблице tblPersons мы можем ввести дополнительную таблицу. и связать это с людьми.
tblNames
PersonID (used to relate with tblPersons)
NameType (single letter code, say F, L, M, U, N for First, Last...)
Name
Тогда у нас будет ОДНА запись в tblPersons для каждого человека, но столько же записей в tblNames, сколько у них есть имен (но если у них нет определенного имени, например, немногие люди имеют псевдоним, в этом нет необходимости). для соответствующей записи в tblNames).
Тогда запрос станет
SELECT [DISTINCT] * from tblPersons P
JOIN tblNames N ON N.PersonID = P.PersonID
WHERE N.Name = 'Jack'
Такая компоновка / структура была бы более эффективной. Кроме того, этот запрос позволяет легко предложить возможность «задано» и «фамилия», просто добавив к предложению WHERE
AND N.NameType IN ('F', 'M', 'N') -- for the "given" names
(or)
AND N.NameType IN ('L', 'U', 'N') -- for the "surname" types. Note that
-- we put Nick name in there, but could just as eaily remove it.
Еще один интерес этого подхода заключается в том, что он позволит хранить там другие типы имен, например, можно добавить форму SOUNDEX для каждого имени под их собственным именем (типом), что позволит легко найти имена, даже если написание приблизительное.
Наконец, еще одним улучшением может быть введение отдельной справочной таблицы, содержащей наиболее распространенные сокращения имен (Пит для Питера, Джек для Джона, Билл для Уильяма и т. Д.), И использование этого для целей поиска (столбцы имен, используемые для предоставления отображаемых значений, останутся такими же, как в исходных данных, но дополнительный поиск / нормализация на уровне поиска увеличит отзыв).