我有这个问题:
SELECT `name`, floor(max(score)), skill
FROM
(SELECT k.`name`, s.`name` as skill, *long complex formula* as score
FROM `keywords_skills` ks
JOIN keywords k ON k.id = ks.keyword_id
JOIN skills s ON s.id = ks.skill_id
JOIN jobs_keywords jk ON jk.keyword_id = k.id
WHERE job_id = 87293) t1
GROUP BY `name`
ORDER BY `name` asc
显然我希望'技能'将同一行称为max(得分),但我不知道如何实现这一点。但是,当我向子查询添加ORDER BY
时,如下所示:
SELECT `name`, floor(max(score)), skill
FROM
(SELECT k.`name`, s.`name` as skill, *long complex formula* as score
FROM `keywords_skills` ks
JOIN keywords k ON k.id = ks.keyword_id
JOIN skills s ON s.id = ks.skill_id
JOIN jobs_keywords jk ON jk.keyword_id = k.id
WHERE job_id = 87293
ORDER BY score DESC) t1
GROUP BY `name`
ORDER BY `name` asc
一切似乎都很棒!我的问题是:我解决了我的问题,还是实施了一个不可靠的黑客攻击,以后会困扰我?
关键字和技能之间存在多对多的关系。我不是只关注得分最高的关键字,而是关注每个关键字得分最高的技能。
我还以为我可以某种方式使用LIMIT 1
(可能在子查询中),但到目前为止还没有想过要实现它的方法。
答案 0 :(得分:2)
我认为你跟你的第一个差不多......除了订单之外还要添加一个LIMIT 1来提高最高技能(按第3列排序,这是你的得分公式
- 每次修订澄清...... 我在相关的JOB ID层次结构中交换查询,然后查找IT技能和关键字而不是反向 - 依赖关键字技能。在您需要的情况下,您将需要一个嵌套查询...示例:
Job A has Keywords
Word A
Skill A-1 Score:90 (you want this one)
Skill A-2 Score:70
Skill A-3 Score:60
Word B
Skill B-1 Score:30
Skill B-2 Score:20
Skill B-3 Score:95 (you want this one)
Skill B-4 Score:80
Word C
Skill C-1 Score:10
Skill C-2 Score:20
Skill C-3 Score:30 (you want this one)
内部查询应仅包含关键字ID和关键字的最高分数 - 所有这些都与questino中的一个Job_ID相关联。然后,再次重新加入,但这一次,我们不再需要job_keywords,因为每个K.ID和名称描述都在预先查询中。然后,只需要重新加入符合资格SCORE的技能。
SELECT STRAIGHT_JOIN
PreQuery.Keyword,
s.name as Skill,
PreQuery.Score
from
( SELECT STRAIGHT_JOIN
k.id,
k.name Keyword,
max( s.Score ) maxScore
from
jobs_keywords jk
join keywords k
on jk.keyword_id = k.id
join keyword_skills ks
on k.id = ks.keyword_id
join skills s
on ks.skill_id = s.id
where
jk.job_id = 87293
group by
k.id,
k.name ) PreQuery
join keyword_skills ks
on PreQuery.id = ks.keyword_id
join skills s
on ks.skill_id = s.id
AND PreQuery.maxScore = s.Score
order by
PreQuery.Keyword