Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql订购解决方案:它能持续工作吗?_Mysql_Sql_Subquery - Fatal编程技术网

mysql订购解决方案:它能持续工作吗?

mysql订购解决方案:它能持续工作吗?,mysql,sql,subquery,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

我有一个疑问:

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
很明显,我希望“skill”和max(score)指的是同一行,但我不知道如何做到这一点。但是,当我向子查询添加一个
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
一切似乎都很好!我的问题是:我是否解决了我的问题,或者只是实施了一个不可靠的黑客攻击,这将困扰我以后


编辑:也许我应该解释一下我在寻找什么:

关键词和技能之间存在多对多关系。我不是简单地寻找得分最高的关键词,而是每个关键词得分最高的技能


我还认为我可以以某种方式使用
限制1
(可能在子查询中),但到目前为止还没有想到一种方法来实现这一点。

我认为您已经接近您的第一个限制了。。。只需在order by的基础上增加一个限制1,将最高技能放在第一位(order by column 3是您的分数公式)

--根据修订后的澄清。。。 我在讨论中的职务ID的层次结构中交换查询,然后查找其技能和关键字,而不是相反的-依赖于关键字技能。如果需要,您将需要一个嵌套查询…示例:

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_关键字,因为每个K.id和名称描述都在预查询中。然后,只需要重新加入到与合格分数匹配的技能

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

没错,去掉那个子查询并添加一个限制,你就没事了。记住,如果你使用GROUP BY,你就不能保证得到最高的分数,这就是你要找的。很好的解决方案,但与我遇到的问题不同。为我原来的问题添加了澄清…@JIStone,用复杂的子查询修改了答案-查询