Mysql 将多行与SQL查询中的多行进行匹配并查找百分位匹配?

Mysql 将多行与SQL查询中的多行进行匹配并查找百分位匹配?,mysql,sql,database,codeigniter,active-record-query,Mysql,Sql,Database,Codeigniter,Active Record Query,目前我正在搭建一个招聘平台。雇主可以发布工作并接受申请。雇主可以设定求职者必须符合的许多技能要求。求职者还可以增加他们所拥有的许多技能 我想知道的是,每个求职者的技能中有多少符合每个工作的雇主要求,以便在视图中显示百分位匹配。理想情况下,我希望根据求职者技能表和雇主要求表中存在的技能字符串找到匹配项 以下是3个表中每个表的数据库安排: 应用程序: id |工作|求职者|雇主|申请|日期|创建日期 雇主要求: id |技能|姓名|要求|级别|技能|字符串|工作|字符串|雇主|字符串|创建日期 求职

目前我正在搭建一个招聘平台。雇主可以发布工作并接受申请。雇主可以设定求职者必须符合的许多技能要求。求职者还可以增加他们所拥有的许多技能

我想知道的是,每个
求职者的技能
中有多少符合每个工作的
雇主要求
,以便在视图中显示百分位匹配。理想情况下,我希望根据
求职者技能表和
雇主要求表中存在的
技能字符串
找到匹配项

以下是3个表中每个表的数据库安排:

应用程序:

id |工作|求职者|雇主|申请|日期|创建日期

雇主要求:

id |技能|姓名|要求|级别|技能|字符串|工作|字符串|雇主|字符串|创建日期

求职者技能:

id |技能|姓名|级别|求职者|字符串|技能|字符串|字符串|创建日期

我有以下代码,它根据传递的“$job\u str”获取所有
应用程序。下面的代码只是一个简单的get,但不确定从这里到哪里

function skills_match($job_str){

    $this->db->select('*')
             ->from('applications')
             ->where('job_string', $job_str)
             ->join('users', 'users.string = applications.jobseeker_string', 'left');

    $applications = $this->db->get();

    return $applications;

}
应用程序表-示例数据:

+--------+------------------+------------------+------------------+
|id |工作|求职者|雇主|字符串|
+--------+------------------+------------------+------------------+
|1 | vs71FVTBb12DdGlf | uMIsuDJaBuDmo8iq | biQxyPekn6iayIgm|
|2 | vs71FVTBb12DdGlf | x7phhsvnwj1yhy | biQxyPekn6iayIgm|
|3 | vs71FVTBb12DdGlf | Fm1TIJLxz6Xg6QPk | biQxyPekn6iayIgm|
+--------+------------------+------+-----+---------+-------+------+

业主要求-样本数据:


+--------+------------------+-------------+------------------+------------------+
|id |工作|技能|姓名|技能|字符串|雇主|字符串|
+--------+------------------+-------------+------------------+-----------------+|
|1 | vs71fvtbb12dgdglf | PHP | 9Y8XeCWqJXzkZ5dD | biQxyPekn6iayIgm|
|2 | vs71FVTBb12DdGlf | JavaScript | O6es19t5CgcRHvct | biQxyPekn6iayIgm|
|3 | vs71fvtbb12dgdglf | HTML | wx4evsxxc62bwin7p | biQxyPekn6iayIgm|
|4 | vs71fvtbb12dgdglf | Python | jx15rH1vrGLmsVmq | biQxyPekn6iayIgm|
|5 | vs71FVTBb12DdGlf | SQL | EksP7mEip0Hs4zKd | biQxyPekn6iayIgm|
|6 | vs71FVTBb12DdGlf |小于| fj40m4hkiuDGtbzr | biQxyPekn6iayIgm|
+--------+------------------+-------------+------+-----+---------+-------+------+
求职者技能-样本数据:


+--------+------------------+------------------+------------------+
|id |求职者|技能|姓名|技能|字符串|
+--------+------------------+------------------+------------------+
|1 | uMIsuDJaBuDmo8iq | PHP | 9Y8XeCWqJXzkZ5dD|
|2 | uMIsuDJaBuDmo8iq |主干| 4VIiAxZoL1VbPnTa|
|3 | x7phhsvnwj1yhy |小于| fj40m4hkiuDGtbzr|
|2 | x7phhsvnwj1yhy | Ruby | gTZg4fwYuzMMFcBw|
|3 | x7phhsvnwj1yhy | SQL | EksP7mEip0Hs4zKd|
|1 | Fm1TIJLxz6Xg6QPk | PHP | 9y8xecwqjxzk5dd|
|2 | Fm1TIJLxz6Xg6QPk | Python | jx15rH1vrGLmsVmq|
|3 | Fm1TIJLxz6Xg6QPk | HTML | wx4evsXC62BWiN7p|
|3 | Fm1TIJLxz6Xg6QPk | Git | aR9B9ns1sHlGrzFw|
+--------+------------------+------+-----+---------+-------+------+

基于上述情况,这应输出匹配技能的百分比或数量:

应用程序-以下是每个应用程序匹配技能的数量/百分比:

uMIsuDJaBuDmo8iq-1/6(16.666%)
x7phHsVnwJ1K1yHy-2/6(33.333%)
Fm1TIJLxz6Xg6QPk-3/6(50%)


如果有任何问题,请发问。提前感谢您的帮助。

首先,以下是两个问题:

  • 哪位申请人最适合我的业务
  • 哪位雇主最适合我的技能
  • 这两个问题看起来可能相同,但事实并非如此

    第一个问题: 我希望所有符合我的任何要求的申请人,按我的要求数量排序。首先,我得到所有匹配项:

    select *
    from Requirements r 
    inner join Jobseeker j
    on r.skill_string = j.r.skill_string 
    where job_string = 'vs71FVTBb12DdGlf';
    
    然后我对em进行分组、计数等:

    select 
      jobseeker_string, 
      count(1) / (select count(1) from Requirements where job_string = 'vs71FVTBb12DdGlf') as match_percentage
    from Requirements r 
    inner join Jobseeker j
    on r.skill_string = j.r.skill_string 
    where job_string = 'vs71FVTBb12DdGlf'
    group by jobseeker_string;
    
    第二个问题:有点难,因为申请人可能想知道他/她是否符合一定比例的工作技能,但也符合他自己的技能(这可能也适用于第一个问题)。查询如下:

    select 
      job_string, 
      count(1) / (select count(1) from Requirements where jobseeker_string  = 'uMIsuDJaBuDmo8iq') as my_match,
      count(1) / (select count(1) from Requirements where job_string = r.job_string) as job_match
    from Requirements r 
    inner join Jobseeker j
    on r.skill_string = j.r.skill_string 
    where jobseeker_string = 'uMIsuDJaBuDmo8iq'
    group by job_string;
    
    请注意:这个查询是我写出来的,它可能包含一些打字错误

    如果您想按以下方式订购:

    select * from
      ([[insert the above query here]]) t
    order by field.
    
    组合:

    select 
      job_string, 
      jobseeker_string
      count(1) / (select count(1) from Requirements where jobseeker_string  = r.jobseeker_string ) as seeker_match,
      count(1) / (select count(1) from Requirements where job_string = r.job_string) as job_match
    from Requirements r 
    inner join Jobseeker j
    on r.skill_string = j.r.skill_string 
    group by job_string, jobseeker_string;
    
    应用程序

    select * from 
      (select 
        job_string, 
        jobseeker_string
        count(1) / (select count(1) from Requirements where jobseeker_string  = r.jobseeker_string ) as seeker_match,
        count(1) / (select count(1) from Requirements where job_string = r.job_string) as job_match
      from Requirements r 
      inner join Jobseeker j
      on r.skill_string = j.r.skill_string 
      group by job_string, jobseeker_string) t
    inner join applications a
    on t.job_string = a.job_string and t.jobseeker_string = a.t.jobseeker_string
    

    MySQL为您提供了一种很好的方式来处理分组、if和average。 你有没有玩过AVG(如果…)

    假设您有两个带有两列的表

    类似这样的情况(抱歉,sqlfiddle已停止工作):

    第一张表格:

    id  category    element
    1   number  two
    2   number  three
    3   number  four
    4   number  five
    5   number  eleven
    6   fruit   banana
    7   fruit   pineapple
    8   fruit   pear
    9   fruit   strawberry
    
    第二张表格:

    id  category    element
    1   number  one
    2   number  five
    3   number  six
    4   number  seven
    5   number  three
    6   fruit   apple
    7   fruit   banana
    
    1) 您想知道在第二个表中可以找到第一个表的多少个元素:

        select count(*) as total
        from first_table t1 
        join second_table t2 
        on t1.element = t2.element
    
    会回来的

     total
     3
    
    2) 通过左连接,您可能会获得有价值的信息:

        select 
            count(*) as total, 
            count(t2.element) as number_matching
        from first_table t1
        left join second_table t2
        on t1.element = t2.element
    
    这将为您提供元素总数和匹配的元素数。除以,你就有了百分比

      total    number_matching
      9        3
    
    3) 通过avg和if,我们可以直接得到0和1之间的比例:

        select
            AVG(IF(t2.element IS NULL, 0, 1)) as proportion_matching
        from first_table t1
        left join second_table t2
        on t1.element = t2.element
    
    返回

    proportion_matching
    0.33333
    
    4) 格式为百分比,按您的方便程度四舍五入

        select
            ROUND(AVG(IF(t2.element IS NULL, 0, 1)) * 100, 1) as percent_matching
        from first_table t1
        left join second_table t2
        on t1.element = t2.element
    
    你得到了什么

    percent_matching
    33.3
    
    5) 实际上,您可以按类别将结果分开

        select
            t1.category,
            ROUND(AVG(IF(t2.element IS NULL, 0, 1)) * 100, 1) as percent_matching
        from first_table t1
        left join second_table t2
        on t1.element = t2.element
        group by t1.category
    
    请记住,这实际上是“表1中可在表2中找到的元素百分比”

    6) 将此应用于应用程序和技能集。。。 你会回顾求职者的求职申请
    category  percent_matching
    fruit     25.0
    number    40.0
    
        SELECT
            a.job_string,
            ROUND(AVG(IF(jobseeker.skill_string IS NULL, 0, 1)) * 100, 1) as percent_matching
        FROM application a  
        JOIN employer_requirements er
        ON er.job_string = a.job_string
        LEFT JOIN jobseeker js
        ON a.jobseeker_string = js.jobseeker_string
        GROUP BY a.job_string
    
        SELECT
            er.job_string,
            ROUND(AVG(IF(jobseeker.skill_string IS NULL, 0, 1)) * 100, 1) as percent_matching
        FROM        employer_requirements er    
        LEFT JOIN   jobseeker js
        ON          js.jobseeker_string = er.jobseeker_string
        WHERE       er.jobseeker_string = ?