抠脚大汉扣了半天没抠出来,这个SQL有点难。

业务场景:

一个问答系统,每个回答下面有很多答案,每个答案有两个字段:复制量(copy_count)、点赞量(zan_count)。

已经废了九牛二虎之力,从琐碎的表中得出来一个查询结果,如图:

image.png

求助:

求每个答案下面copy_count最大的答案,如果单个问题下有多个答案的copy_count相同,那么就在他们中间取点赞数最大的那个答案。也就是 group by copy_count desc,zan_count desc

预期的答案:

image.png

我的数据库版本5.7.25,没有OVER()函数
请大家给个SQL。

阅读 2.8k
3 个回答
select * from (select * from 图1 order by copy_count,zan_count) tmp group by tmp.question_id;

先倒序排列再进行分组,会保留每组的第一条也就是最大的那条。

SELECT
  question_id,
  answer_id,
  copy_count,
  zan_count,
  ROW_NUMBER() OVER (
    PARTITION BY question_id
    ORDER BY
      copy_count desc, zan_count desc
  ) AS rk
FROM
  qa
where rk = 1

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

分开写吧,性能差不多,主要是好理解。
根据分页请求先把question_id拿了,这没问题吧。然后遍历,where question_id = qid order by ... limit 1
反正一页也就10-100条数,简单查询跑N+1也不是什么大事,反正都在一个长连接里面。

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题