mysql结果跟预期不一样,请大家指教下。

在一个问答系统中,业务中统计后的数据如下表(这里定为answer_copy_count吧):
image.png
意思是:每个问题(question_id)下面的有很多答案,每个答案(answer_id)有被复制的次数(copy_count)。
现在想求的是,每个问题下面复制数最大的答案。

我的sql语句为:

SELECT question_id,answer_id,MAX(copy_count) AS max_copy_count From answer_copy_count GROUP BY question_id;

可是查询结果是:
image.png

什么鬼? 第二行的answer_Id不是应该为4么?怎么是3 ????

说明:上面的语句之前会报错,报“SELECT list is not in GROUP BY clause and contains nonaggregated column...”,我修改了配置文件,把only_full_group_by干掉了。现在不报错了,可是数据跟预期的不一样啊?

手册说是除了聚合函数外,查询的其他字段也必须出现在group by 里面,像这样:

SELECT question_id,answer_id,MAX(copy_count) AS max_copy_count FROM answer_copy_count GROUP BY question_id,answer_id;

可是这样有毛用,跟原表得到的数据一样。。。。
请大神指点一下。

阅读 2.8k
4 个回答

分享个不一样的解决方案吧(仅支持mysql8.0版本及以上),窗口函数,row_number和rank的区别

  1. 初始数据
    image.png
  2. 相同复制数仅取其中一个

    select * from 
     (select question_id,answer_id,copy_count,
      row_number() over(partition by question_id order by copy_count desc) as idx
      from answer_copy_count
     )t 
    where idx=1;

    image.png

  3. 相同复制数全部显示

    select * from 
     (select question_id,answer_id,copy_count,
      rank() over(partition by question_id order by copy_count desc) as idx
      from answer_copy_count
     )t 
    where idx=1;

    image.png

你又没控制answer_id,所以肯定是groupBy中第一条的answer_id当结果给你了。正确的answer_id要根据question_id和max_copy_count再查一次。

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

我这次首先把answer_copy_count表的结果按照copy_count排序了一下。如果在没有控制answer_id的情况下,mysql会把第一个anser_id当结果返回,那么我使用下面这种方法,能得到想要的结果:

SELECT question_id,answer_id,MAX(copy_count) AS max_copy_count FROM (select question_id, answer_id, count(answer_id) as copy_count from user_data where type = 'copy' group by answer_id, question_id ORDER BY copy_count DESC) answer_copy_count GROUP BY question_id;

这种目前能得到想要的结果,重要的是,能解决下面的一个问题:
每个问题下面有很多个答案,如果这多个答案中,他们的copy_count相同,那么,会出现重复的数据。比如:

question_idanswer_idcopy_count
118
232
242

预期为每个问题下面copy_count最大的答案。可是结果会出现一个问题下面,多个答案,如何取舍的问题。

不知道有没有其他稳妥的办法,我总感觉我上面的sql不靠谱。

SELECT question_id , answer_id , copy_count FROM answer_copy_count WHERE copy_count IN (SELECT MAX(copy_count) FROM answer_copy_count GROUP BY question_id) GROUP BY question_id

想了一个 SQL,但是觉得这样性能并不算很好

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