jjzjj

mysql排序: will it work consistantly?解决方案

coder 2023-10-24 原文

我有这个查询:

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(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

一切似乎都很好!我的问题是:我是否解决了我的问题,或者只是实现了一个不可靠的 hack,以后会困扰我?


编辑:也许我应该解释更多我在寻找什么:

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

我还认为我可以以某种方式使用 LIMIT 1(可能在子查询中),但到目前为止还没有想到实现它的方法。

最佳答案

我认为你已经接近第一个了...只需在 order by 之外添加一个 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

关于mysql排序: will it work consistantly?解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5747582/

有关mysql排序: will it work consistantly?解决方案的更多相关文章

  1. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  2. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  3. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  4. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  7. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  8. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  9. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

  10. Ruby 守护进程和 JRuby - 备选方案 - 2

    我有一个应用程序正在从Ruby迁移到JRuby(由于需要通过Java提供更好的Web服务安全支持)。我使用的gem之一是daemons创建后台作业。问题在于它使用fork+exec来创建后台进程,但这对JRuby来说是禁忌。那么-是否有用于创建后台作业的替代gem/wrapper?我目前的想法是只从shell脚本调用rake并让rake任务永远运行......提前致谢,克里斯。更新我们目前正在使用几个与Java线程相关的包装器,即https://github.com/jmettraux/rufus-scheduler和https://github.com/philostler/acts

随机推荐