php - MySQL 查询过滤器和排序行匹配类似于工作匹配或功能比较

标签 php mysql wordpress phpmyadmin

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”和“OR”的组合也是如此,或者这是否需要特殊的 MySQL“语句/函数”。 MySQL 对我来说有点复杂。

更新

因为所有值都是(选择/复选框/单选)我可以将值设置为数字(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,因为我认为您自己研究它很有值(value)。如果您手头有数据库,请创建我建议的设计,并用一些测试数据填充它。然后,开始编写一个简单的查询,例如列出特定用户或工作的技能。

您还可以使用 SQL Fiddle 或类似工具,这样如果您遇到困难,您可以使用确切的测试数据和您遇到的问题提出问题。

关于php - MySQL 查询过滤器和排序行匹配类似于工作匹配或功能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50284611/

相关文章:

mysql - 返回产品 ID 及其计数,即使 mysql 中没有它们的变体

mysql - 为每一行使用多个 'where' 子句更新多行

php - 使用关联数组的索引创建可点击的链接

javascript - 当 jQuery 事件运行时,如何触发谷歌地图调整大小?

PHP - 下载次数

PHP 在多个查询和表上插入和更新

php - 如何使用 Jquery 和 PHP 将行复制到 MySQL 中的另一个表?

php - 使用 Woocommerce 更新 Wordpress 上的用户信息?

php - 如何在一行中显示签到表

php - 如何在不跳过日期的情况下添加 1 个月,即 2 月