mysql: определить пол по имени (поиск значения из списка слов в поле, содержащем несколько слов)

246
02 октября 2021, 03:40

Подскажите как сделать запрос в БД, чтобы выбрать только такие записи, в которых пользователь имеет определённый пол?

Т.е. у меня есть таблица users, в которой есть поле name, содержащее информацию о ФИО пользователя. Кроме того у меня есть список всех мужских имён (в общем случае только нужный мне список имен, типа Андей,Иван,Пётр)

С одной стороны запрос можно было бы сделать так:

select name 
from users
where find_in_set(name, "андрей,иван,пётр")>0

Но проблема в том, что в name содержится именно ФИО, т.е. несколько слов. Подскажите как корректно решить данную задачу?

Answer 1

Есть же оператор IN

..WHERE `name` IN ('name1', 'name2', 'name3')

https://www.w3schools.com/Sql/sql_in.asp

Answer 2

попробуйте (перечислить мужские имена) так:

SELECT * FROM `users` WHERE name REGEXP "Василий |Иван |Евгений " = 1

да функции для работы с строками типа SUBSTRING_INDEX будут быстрее, но и кода писать больше (если запросы будут постоянные то лучше наверное с строковыми функциями, а если не частые и не много данных то можно и регулярку оставить)

Answer 3

По идее, если считать, что большая часть записей имеет вид Фамилия Имя, то можно сделать такой запрос:

select name
from inventor
where find_in_set(SUBSTRING_INDEX(name, ' ', -1), "Абрам,Аваз,Аввакум,Август,Августин,Авдей,Авраам,Автандил,Агап,Агафон,Аггей,Адам,Адис,Адольф,Адриан,Азамат,Айдар,Айнур,Айрат,Аким,Алан,Алей,Александр,Алексей,Али,Альберт,Альфред,Амадей,Амадеус,Амаяк,Амвросий,Ананий,Анастасий,Анатолий,Анвар,Ангел,Андоим,Андрей,Аникита,Антон,Арам,Арий,Аристарх,Аркадий,Арман,Арно,Арнольд,Арон,Арсен,Арсений,Арслан,Артем,Артемий,Артур,Архип,Аскар,Аскольд,Аслан,Афанасий,Ахмет,Ашот,Бальтазар,Бежен,Бенедикт,Берек,Бернард,Бертран,Богдан,Болеслав,Борис,Бронислав,Булат,Вадим,Валентин,Валерий,Вальтер,Варфоломей,Василий,Вацлав,Велизар,Венедикт,Вениамин,Викентий,Виктор,Вилли,Вильгельм,Виссарион,Виталий,Витольд,Владимир,Владислав,Владлен,Володар,Вольдемар,Всеволод,Вячеслав,Гавриил,Галактион,Гарри,Гастон,Гаяс,Гевор,Геннадий,Генрих,Георгий,Геракл,Геральд,Герасим,Герман,Глеб,Гордей,Гордон,Горислав,Градимир,Григорий,Гурий,Густав,Давид,Дамир,Даниил,Даниэль,Данияр,Дарий,Дементий,Демид,Демосфен,Демьян,Денис,Джамал,Джордан,Дмитрий,Добрыня,Дональд,Донат,Дорофей,Евгений,Евграф,Евдоким,Евсевий,Евсей,Евстафий,Егор,Елеазар,Елисей,Емельян,Еремей,Ермолай,Ерофей,Ефим,Ефрем,Жан,Ждан,Жорж,Захар,Зиновий,Ибрагим,Иван,Игнатий,Игорь,Илларион,Ильдар,Ильнар,Ильнур,Илья,Ильяс,Иннокентий,Иоанн,Иосиф,Ипполит,Искандер,Ислам,Камиль,Карим,Карл,Кирилл,Клим,Кондрат,Константин,Корней,Кузьма,Лавр,Лаврентий,Лев,Леон,Леонид,Леонтий,Леопольд,Лука,Лукьян,Любим,Макар,Максим,Максимилиан,Марат,Марк,Марсель,Мартин,Матвей,Мирон,Мирослав,Митрофан,Михаил,Михей,Мишель,Мстислав,Мурат,Муслим,Назар,Назарий,Наиль,Натан,Наум,Нестор,Никанор,Никита,Никифор,Николай,Никон,Нифонт,Норман,Овидий,Олан,Олег,Олесь,Онисим,Орест,Осип,Оскар,Павел,Петр,Платон,Прохор,Равиль,Радик,Радмир,Радомир,Раду,Рамазан,Рамиль,Ратибор,Ратмир,Рафаэль,Рахим,Рашид,Ринат,Ричард,Роберт,Родион,Ролан,Роман,Ростислав,Рудольф,Руслан,Рустам,Сабир,Савва,Савелий,Салим,Самвел,Самсон,Святослав,Севастьян,Семён,Серафим,Сергей,Соломон,Спартак,Спиридон,Станислав,Степан,Стефан,Сулейман,Султан,Тагир,Тамерлан,Тарас,Теодор,Тигран,Тимофей,Тимур,Тихон,Трофим,Умар,Устин,Фаддей,Фарид,Федор,Федот,Феликс,Феодосий,Фердинанд,Фидель,Филимон,Филипп,Флор,Флорентий,Фома,Франц,Фридрих,Фуад,Харитон,Хасан,Христиан,Христос,Христофор,Шамиль,Эдвард,Эдгар,Эдуард,Эльдар,Эмиль,Эмин,Эмир,Эммануил,Эрик,Эрнест,Юлиан,Юлий,Юрий,Юсуф,Юхим,Яким,Яков,Ян,Януарий,Яромир,Ярослав,Ясон")

А все остальное прошерстить руками, но так хотелось бы универсальный метод, поскольку если записей не в нужном формате много, то ручная правка будет очень ресурсоемкой

READ ALSO
Как лучше написать sql запрос

Как лучше написать sql запрос

Есть две таблицы

177
LEFT JOIN дублирует строки

LEFT JOIN дублирует строки

Доброе время суток, пытаюсь получить значение с таблицы doctor_to_category (структура: doctor_category_id | doctor_id | category_id)

122
UPSERT в MySQL не по первичному ключу

UPSERT в MySQL не по первичному ключу

Мне надо актуализировать базу данныхУ меня есть какой-то набор значений, к примеру:

89
При наведении на елемент появляются другие елементы

При наведении на елемент появляются другие елементы

Хочу сделать при наведении на елемент, что бы правее появлялись несколько похожих елементов и пока я веду указатель мыши к появившимся елементам...

234