按匹配次数排序 table

Order table by number of matches

我有以下数据库模式:

申请者table:

applicant_id  | name 
--------------|----- 
      1       | Bill  
      2       | Tom  
      3       | Sam   
      4       | Alex  

技能table:

skill_id  | skill_name 
----------|-----------
    1     |    C++  
    2     |    java  
    3     |    html   
    4     |    PHP  

ApplicantSkills(申请人和技能之间的多对多)

applicant_id  | skill_id 
--------------|-----------
      1       |     1  
      2       |     1  
      2       |     2   
      2       |     3  
      3       |     1  
      3       |     2  

我想 select 所有申请人,但按特定技能列表的匹配次数排序。

例如,如果我的技能列表是 C++,java 和 html 我希望它们按如下顺序排列:

 name | matches
------|--------- 
 Tom  |    3   
 Sam  |    2 
 Bill |    1
 Alex |    0

如有任何建议,我们将不胜感激。

  • Left Outer Join : 从 applicants table 得到所有 applicants 即使他没有任何 skill(Alex )
  • Count Aggregate : Count每个applicants
  • 的技能
  • Order by : 根据应聘者拥有的技能数量排序结果

试试这个

SELECT          a.NAME , 
                Count(skill_id) AS matches 
FROM            applicants A 
LEFT OUTER JOIN 
                (SELECT     applicant_id, 
                            s.skill_id 
                 FROM       applicantskills 
                 INNER JOIN skills s 
                 ON         a.skill_id = s.skill_id 
                 WHERE      skill_name IN ('C++','java','html')) ask 
ON a.applicant_id= ask.applicant_id 
ORDER BY   matches DESC

MM93提出的解决方案几乎正确。内部查询中缺少 GROUP BY 子句,主查询中缺少 IFNULL

如果有人感兴趣,这里是正确的解决方案:

SELECT a.applicant_name, IFNULL(sg.matches, 0)
FROM Applicants a
LEFT OUTER JOIN (
    SELECT a.applicant_id, count(s.skill_id) as matches
    FROM Applicants a
        JOIN ApplicantSkills aps ON aps.applicant_id = a.applicant_id
        JOIN Skills s ON aps.skill_id = s.skill_id
    WHERE s.skill_name IN ('C++','java','html')
        GROUP BY(a.applicant_id)
) sg ON a.applicant_id = sg.applicant_id
ORDER BY sg.matches DESC