【问题标题】:Order table by number of matches按匹配数排序表
【发布时间】:2015-12-12 12:06:11
【问题描述】:

我有以下数据库架构:

申请人表:

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

技能表:

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  

我想选择所有申请者,但要根据特定技能列表的匹配数对他们进行排序。

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

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

任何建议将不胜感激。

【问题讨论】:

    标签: sql sql-order-by


    【解决方案1】:
    • Left Outer Join :从applicants 表中获取所有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
    

    【讨论】:

    • 抱歉,该查询仅按拥有技能的数量对申请人进行排序,而不是按技能列表匹配的数量。
    • @user3715778 - 立即查看,更新我的答案
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 2016-11-26
      • 1970-01-01
      相关资源
      最近更新 更多