按匹配次数排序 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
我有以下数据库模式:
申请者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