2014-03-30 22 views
3

目前我正在構建招聘平臺。僱主可以發佈工作並接收申請。僱主可以設置求職者必須匹配的許多技能要求。求職者也可以添加他們擁有的許多技能。匹配SQL查詢中許多行的許多行並找到百分比匹配?

我試圖找出每個jobseekers_skills匹配employer_requirements爲每個工作,以顯示視圖中的百分比匹配。我會非常想找到基於skill_string存在於這兩個比賽中jobseeker_skills表和employer_requirements

下面是各3個表的數據庫安排:

應用:

id | job_string | jobseeker_string | employer_string | application_string | date_created

employer_requirements:

id | skill_name | requirement_level | skill_string | job_string | employer_string | date_created

jobseeker_skills:

id | skill_name | level | jobseeker_string | skill_string | string | date_created

我有下面的代碼,獲取基於其上通過的 '$ job_str' 所有applications。下面的代碼只是一個簡單的獲取,但不確定從哪裏去。

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 | job_string | jobseeker_string | employer_string | +--------+------------------+------------------+------------------+ | 1 | vs71FVTBb12DdGlf | uMIsuDJaBuDmo8iq | biQxyPekn6iayIgm | | 2 | vs71FVTBb12DdGlf | x7phHsVnwJ1K1yHy | biQxyPekn6iayIgm | | 3 | vs71FVTBb12DdGlf | Fm1TIJLxz6Xg6QPk | biQxyPekn6iayIgm | +--------+------------------+------+-----+---------+-------+------+

僱主要求 - 示例數據:

+--------+------------------+-------------+------------------+------------------+ | id | job_string | skill_name | skill_string | employer_string | +--------+------------------+-------------+------------------+-----------------+| | 1 | vs71FVTBb12DdGlf |PHP | 9Y8XeCWqJXzkZ5dD | biQxyPekn6iayIgm | | 2 | vs71FVTBb12DdGlf |JavaScript | O6es19t5CgcRHvct | biQxyPekn6iayIgm | | 3 | vs71FVTBb12DdGlf |HTML | wx4evsXC62BWiN7p | biQxyPekn6iayIgm | | 4 | vs71FVTBb12DdGlf |Python | jx15rH1vrGLmsVmq | biQxyPekn6iayIgm | | 5 | vs71FVTBb12DdGlf |SQL | EksP7mEip0Hs4zKd | biQxyPekn6iayIgm | | 6 | vs71FVTBb12DdGlf |LESS | fj40m4hkiuDGtbzr | biQxyPekn6iayIgm | +--------+------------------+-------------+------+-----+---------+-------+------+ 求職者技能 - 示例數據:基於上述

+--------+------------------+------------------+------------------+ | id | jobseeker_string | skill_name | skill_string | +--------+------------------+------------------+------------------+ | 1 | uMIsuDJaBuDmo8iq | PHP | 9Y8XeCWqJXzkZ5dD | | 2 | uMIsuDJaBuDmo8iq | Backbone | 4VIiAxZoL1VbPnTa | | 3 | x7phHsVnwJ1K1yHy | LESS | fj40m4hkiuDGtbzr | | 2 | x7phHsVnwJ1K1yHy | Ruby | gTZg4fwYuzMMFcBw | | 3 | x7phHsVnwJ1K1yHy | SQL | EksP7mEip0Hs4zKd | | 1 | Fm1TIJLxz6Xg6QPk | PHP | 9Y8XeCWqJXzkZ5dD | | 2 | Fm1TIJLxz6Xg6QPk | Python | jx15rH1vrGLmsVmq | | 3 | Fm1TIJLxz6Xg6QPk | HTML | wx4evsXC62BWiN7p | | 3 | Fm1TIJLxz6Xg6QPk | Git | aR9B9ns1sHlGrzFw | +--------+------------------+------+-----+---------+-------+------+

這應該輸出eit她的一個百分比還是沒有。匹配的技能:

應用 - 下面是匹配的技能,爲每個應用程序的數量/百分比: uMIsuDJaBuDmo8iq - 1/6 (16.666%) x7phHsVnwJ1K1yHy - 2/6 (33.333%) Fm1TIJLxz6Xg6QPk - 3/6 (50%)

任何問題,那麼請離火。感謝您的幫助提前。

+0

您能否提供幾行樣本數據,以及幾行所需的結果? –

+0

@OllieJones我剛剛對樣本數據進行了編輯,並對預期結果進行了簡要總結,如果您需要其他內容,請隨時詢問。 – learn

+0

@OllieJones爲了說清楚,我仍然想要獲得某項工作的所有應用程序,但只有'order_by'具有最佳匹配技能的求職者 – learn

回答

2

首先,這些都是2個問題:

  1. 而申請人的匹配我的生意最好
  2. 有關僱主的匹配我的技能是最好的。

這兩個問題可能看起來一樣,但它們不是。

第一個問題: 我希望所有符合我的要求的申請人,按我的要求數量排列。首先我得到的所有匹配:

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; 

Applicatons

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

首先,我真的很感激你花時間。雖然,我不認爲你理解這個問題。我有很多應用程序,我希望能夠查看所有這些應用程序,無論它們是否匹配。 Foreach應用程序我想了解有多少求職者技能與僱主對該特定工作的要求匹配。 – learn

+0

添加了一個組合查詢,它將返回每個作業的所有求職者列表及其各自的匹配百分比。 – Alfons

+0

這仍然不起作用,因爲您沒有考慮到「應用程序」表,我真的知道誰已經申請了這份工作。從他們我會得到'jobseeker_skills'基於'applications.jobseeker_string = jobseeker_skills.jobseeker_string'之間的某種連接,並得到像'applications.job_string = employer_requirements.job_string'這樣的'employer_requirements'。因此,應用程序表很重要 – learn

1

MySQL爲您提供了一個很好的方式來玩分組,如果和平均。 你打過各地的AVG(IF(..)

說你有兩個表一對夫婦列

像這樣的東西(抱歉,sqlfiddle是失去工作):。

first_table:

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 

second_table:

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)用左連接,你可能會得到寶貴的Infor:

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和如果,我們可以得到直接在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)格式爲百分比,圓你conveninence ...

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 

記住這其實是

category percent_matching 
fruit  25.0 
number 40.0 

6)將這一應用程序和技能「可以在表2中可以發現,在表中的一個元素的比例」 ...... 你會回顧求職者申請如下:

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 

7)當然,你可以過濾你的工作字符串在哪裏,如果你喜歡。 實際上,這裏添加的應用程序表中的連接只是確保您僅獲得用戶實際申請的作業的結果。但是,如果你已經有了一個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 = ? 

7),我讓你在活動記錄查詢拋出這個(這不是我所知道的最好的部分;)

+0

謝謝。我真的很感激你花時間,但我一直在與原來的答案一起工作,發現它在我開始使用它的時候確實有用。我會採取很多你給我看的東西,並嘗試將它融入到我的工作中,但再次感謝您抽出時間。 – learn