MySQL Query filter и порядок строк на совпадение аналогично заданию или функции сравнения - PullRequest
0 голосов
/ 11 мая 2018

Google и Stack обычно помогают мне, куда я иду, но я застрял. Я верю, потому что я не ищу правильные термины. Было много сценариев, которые были близки, но либо я не понял результата, либо это было не то, что мне было нужно.

Мне кажется, я ищу слова "сопоставить" или "сравнить".

В моей таблице есть как поставщики вакансий, так и соискатели с очень нестандартными данными. Хорошая новость заключается в том, что каждое поле является заданным значением (выберите / флажок / радио)

вот доступные данные, около 17 столбцов навыков

 type   |  position  |  skillset 1 |  checkbox  | skillset 3 | salary
 -------+------------+-------------+------------+------------+---------
 Job    |  Sales     |   Talent 1  |  1,2,3     | Talent 3   |  50
 Seeker1|  Manager   |   Avail     |  avail     |  avail     |
 -------+------------+-------------+------------+------------+--------
 Job    |  Sales     |   Talent 1  |  2         | Talent 3   |  50
 Seeker2|  Manager   |   Avail     |  avail     |  avail     |
 -------+------------+-------------+------------+------------+---------
 Job    |  Sales     |   Talent 1  |  2,3       | Talent 3   |  60
 POSTED |  Manager   |   Needed    |  Needed    | Needed     |
 -------+------------+-------------+------------+------------+---------
 Job    |  Sales     |   Talent 1  |  2         | Talent 3   |  50
 Seeker3|  Manager   |   Avail     |  avail     | NOT avail  |
 -------+------------+-------------+------------+------------+---------

Это было близко, но я не был уверен, и я не мог заставить его применить к моим таблицам

Найти наиболее подходящую строку в MySQL (InnoDB)

Поскольку все значения являются выбранными, а не свободным текстом, кажется, что подход «сравнения функций» - это направление, но я называю это совпадением, потому что хочу вернуть совпадения в наиболее / лучшем порядке

Я ожидаю увидеть этот результат, когда столбец не совпадает или имеет менее одного совпадения в столбце.

Я хотел бы показать их в «ближайшем» порядке, я полагаю, что единственным способом определения «лучший / ближайший» будет количество столбцов match / true?:

столбцы сравниваются так:

 position   = Sales manager : Match
 skillset 1 = Talent1 avail : Match 
 checkbox   = 1 of 2 needed : Match (partial)
 skillset 1 = Talent3 NOT avail : NO Match 
 Salary     = < = >             : Match
 Columns match  = [4]

Итак, этот парень опубликовал работу

  Job    |  Sales     |   Talent 1  |  2,3       | Talent 3   |  60
  POSTED |  Manager   |   Needed    |  Needed    | Needed     |
  -------+------------+-------------+------------+------------+---------

Его результат матча будет упорядочен от максимума к минимуму:

 Seeker 1|  match    |   match     |  match (IN)|  match     | TRUE  [5]
 Seeker 3|  match    |   match     |  match (IN)|  NO        | TRUE  [4] 
 Seeker 2|  match    |   match     |  NO  (none)|  NO        | TRUE  [3]


 type   |  position  |  skillset 1 |  checkbox  | skillset 3 | salary
 -------+------------+-------------+------------+------------+---------
 Job    |  Sales     |   Talent 1  |  1,2,3     | Talent 3   |  50
 Seeker1|  Manager   |   Avail     |  avail     |  avail     |
 -------+------------+-------------+------------+------------+--------
 Job    |  Sales     |   Talent 1  |  2         | Talent 3   |  50
 Seeker3|  Manager   |   Avail     |  avail     | NOT avail  |
 -------+------------+-------------+------------+------------+---------
 Job    |  Sales     |   Talent 1  |  1         | Talent 3   |  50
 Seeker2|  Manager   |   Avail     |  avail     |  avail     |
 -------+------------+-------------+------------+------------+---------

Так что комбинация «И» и «ИЛИ» собирается это сделать, или для этого требуются специальные MySQL «операторы / функции». MySQL становится немного сложнее для меня.

Обновление

Так как все значения (select / checkbox / radio), я могу установить значения в виде чисел (Manager = 1, Coach = 2 и т. Д.). Но пример строки тоже был бы великолепен, потому что у меня есть ощущение, что я буду бегать в это в другой таблице.

1 Ответ

0 голосов
/ 12 мая 2018

Вам, вероятно, нужно пять столов.Рассмотрим объекты в вашей системе:

  • Соискатель (seeker_id, имя, адрес электронной почты, номер телефона и т. Д.)
  • Skill (skill_id, name)
  • Позиция(job_id, name)

Теперь, как связать их вместе?Хорошо, рассмотрим отношения:

  • Соискатель имеет множество навыков
  • Позиция имеет множество навыков
  • Умение имеет много заданий
  • Умение имеет много искателей

В настоящее время вы решаете эти отношения "имеет много", имеянесколько столбцов, но, как отмечалось в комментариях, с трудом завоеванный опыт работы с базами данных говорит людям, что вы быстро отклеитесь от этого.Ваши SQL-запросы будут неуклюжими, и, если у вас нетривиальный объем данных, они также будут медленными.

Так как отношения имеют-много в обоих направлениях, они известны как "многие кмного "отношений.Для их решения вам нужны промежуточные таблицы, например:

  • seeker_skill (seeker_id, skill_id)
  • job_skill (job_id, skill_id)

Итак,чтобы создать навык ищущего, вы вставляете первичный ключ ищущего и первичный ключ навыка в таблицу seeker_skill.Эта таблица не нуждается в столбце первичного ключа, так как двух внешних ключей достаточно, чтобы определить первичный ключ самостоятельно.

То же самое касается профессиональных навыков.


ЭтоСовет по дизайну вернет вас на правильный путь.Я не добавил SQL, так как думаю, что вам будет полезно изучить его для себя.Если у вас есть база данных, создайте проект, который я предлагаю, и заполните его некоторыми тестовыми данными.Затем начните писать простой запрос, например, чтобы перечислить навыки конкретного пользователя или работы.

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

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