php – MySQL查询过滤器和匹配行上的行类似于作业匹配或功能比较

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  |
 -------+------------+-------------+------------+------------+---------

这很接近,但我不确定,我无法将它应用于我的桌子

Find best matching row in MySQL (InnoDB)

由于所有值都是选择而不是自由文本,所以看起来像“特征比较”方法是方向,但我称之为匹配,因为我想以最佳/最佳顺序返回匹配

当列不匹配或列中的匹配少于一个时,我希望看到此结果.

我希望以“最接近”的顺序显示这些,我想,确定“最佳/最接近”的唯一方法是匹配/真的列数?:

列比较如下:

 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     |
 -------+------------+-------------+------------+------------+---------

“AND”和&组合也是如此. “或”要去做,或者这需要特殊的MySQL“语句/功能”. MySQL对我来说有点复杂.

更新

由于所有值都是(select / checkbox / radio),我可以将值设置为数字(Manager = 1,Coach = 2等)但是字符串示例也会很棒,因为我觉得我会遇到另一张桌子.

最佳答案 你可能需要五张桌子.考虑系统中的对象:

>求职者(seeker_id,姓名,电子邮件地址,电话号码等)
>技能(skill_id,名称)
>职位(job_id,姓名)

现在,如何将它们链接在一起?好吧,考虑一下这些关系:

>求职者有很多技能
>一个职位有很多技能
>一项技能有很多工作
>一项技能有很多寻求者

目前,您通过拥有多个列来解决这些“有很多”关系,但正如评论中所述,来之不易的数据库经验告诉人们您很快会以这种方式解开.你的SQL查询会很尴尬,如果你有一些非常重要的数据,它们也会很慢.

由于两个方向上的关系都很多,因此这些关系被称为“多对多”关系.要解决这些问题,您需要中间表,如下所示:

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

因此,要创建搜索者技能,请将搜索者的主键和技能的主键插入seeker_skill表.此表不需要主键列,因为两个外键足以自行定义主键.

工作技能也是如此.

这种设计建议将使您重回正轨.我没有添加任何SQL,因为我认为对您自己进行研究是有价值的.如果你有一个数据库,请创建我建议的设计,并用一些测试数据填充它.然后,开始编写一个简单的查询,例如列出特定用户或工作的技能.

您也可以使用SQL Fiddle或类似工具,这样如果您遇到问题,您可以使用确切的测试数据和查询来提问.

点赞