mysql查询过滤器和排序行匹配类似于作业匹配或功能比较

qvk1mo1f  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(281)

google和stack通常能帮我找到我要去的地方,但我被困住了。我相信这是因为我没有找到合适的术语。有很多脚本都很接近,但要么我不明白结果,要么它不是我需要的。
我想我在找“匹配”或“比较”。
我的表中既有工作提供者,也有求职者,都有非常自定义的数据。好消息是,每个字段都是一个设定值(select/checkbox/radio)
以下是可用的数据,大约有17个skillset列

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)
因为所有的值都是select,而不是自由文本,所以“featurecompare”方法似乎是一个方向,但我称之为匹配,因为我希望以最大/最佳顺序返回匹配
当一列不匹配或列中的匹配项少于一个时,我希望看到这个结果。
我希望以“最接近”的顺序显示这些,我认为确定“最佳/最接近”的唯一方法是匹配/真的列计数:
列之间的比较如下:

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”&“和”或“s”的组合是要做到这一点,还是需要特殊的mysql“语句/函数”呢。mysql对我来说有点复杂。

更新

因为所有的值都是(select/checkbox/radio),所以我可以将值设置为数字(manager=1,coach=2,等等),但是一个字符串示例也会很好,因为我感觉我会在另一个表中遇到它。

iibxawm4

iibxawm41#

你可能需要五张table。考虑系统中的对象:
求职者(求职者id、姓名、电子邮件地址、电话号码等)
技能(技能id,名称)
职位(职务号、姓名)
现在,如何将它们联系起来?好吧,考虑一下关系:
求职者有很多技能
一个职位有很多技能
一种技能有很多工作
一种技能有很多追求者
目前,您正在通过拥有多个列来解决这些“有很多”关系,但正如在注解中所指出的,来之不易的数据库经验告诉人们,您将很快以这种方式摆脱困境。您的sql查询将是笨拙的,如果您有大量的数据,那么它们也会很慢。
由于这种关系在两个方向上都是多对多的,所以称之为“多对多”关系。要解决这些问题,需要中间表,如下所示:
探索者技能(探索者id,技能id)
工作技能(工作id,技能id)
因此,要创建一个探索者技能,您需要将探索者的主键和技能的主键插入到 seeker_skill table。此表不需要主键列,因为这两个外键本身就足以定义一个主键。
工作技能也是如此。
这个设计建议会让你回到正确的轨道上。我没有添加任何sql,因为我认为您自己研究它会很有价值。如果您手头有一个数据库,请创建我建议的设计,并用一些测试数据填充它。然后,开始编写一个简单的查询,例如列出特定用户或工作的技能。
您还可以使用sqlfiddle或类似的工具,这样,如果您遇到了问题,您就可以用确切的测试数据来提问,并查询您遇到的问题。

相关问题