mysql排序解决方案:它会一致地工作吗?

时间:2011-04-21 17:22:31

标签: mysql sql subquery

我有这个问题:

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(可能在子查询中),但到目前为止还没有想过要实现它的方法。

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