试着写一下我的语句和理解,比老师的更加有可读性,好理解

来源:3-1 如何实现分组选择数据

Henry_Liu

2020-01-10 07:23

老师给出的答案可读性实在太差了,不直观,不符合正常逻辑,老师又不作解释。下面是我的语句:


SELECT c.user_name, c.timestr, c.kills FROM 

(SELECT a.id, a.user_name, b.timestr, b.kills FROM user1 a INNER JOIN user_kills b on a.id = b.user_id) c 

INNER JOIN user_kills d ON c.id = d.user_id AND c.kills <= d.kills

GROUP BY c.user_name, c.timestr

HAVING COUNT(*) <= 2

ORDER BY c.user_name, c.kills DESC;




写回答 关注

3回答

  • 慕祈
    2022-11-30 23:24:52

    SELECT a.user_name, b.timestr, b.kills FROM user1 ainner join

     ( select b.user_id, b.kills, max(b.timestr) as timestr from user_kills b 

       GROUP BY b.user_id, b.kills

     ) b on a.id = b.user_id

    INNER JOIN 

    ( select b.user_id, b.kills, max(b.timestr) as timestrfrom user_kills b 

       GROUP BY b.user_id, b.kills

    ) d 

    ON a.id = d.user_id AND b.kills <= d.kills

    GROUP BY b.kills 

    HAVING COUNT(*) <= 2

    ORDER BY a.user_name, b.kills DESC;

    个人的一个修改,主要思路就是表连接之前先把重复的过滤(数据分组然后取最大的时间)


    慕祈

    有个错误修改一下,GROUP BY b.kills 应该改为GROUP BY a.id, b.kills

    2022-11-30 23:33:21

    共 2 条回复 >

  • 洛奇2019
    2021-01-16 22:33:21

    可以把子查询 c 去掉 ,改成两次 inner join。

  • Henry_Liu
    2020-01-10 08:05:19

    1.括号中的子查询连接两张表,很好理解。

    2.子查询得到的集合再去连接user_kills表,条件c.id = d.user_id,很好理解。

    条件c.kills <= d.kills的作用,使得杀怪最多的天数只出现一次,第二多的天数出现两次,如此类推。

    重复出现的次数,其实就等于杀怪数的排名。放两个图,不懂的人结合图细细品一下。

    http://img2.mukewang.com/5e17bf7700015b0304280396.jpg

    http://img2.mukewang.com/5e17bf770001b53d03130494.jpg

    3.GROUP BY c.user_name, c.timestr分组。GROUP BY有去除重复的作用,此时的表:

    http://img1.mukewang.com/5e17bf900001923f03130228.jpg

    4.HAVING COUNT(*) <= 2,把重复出现次数小于等于2的保留,也就是杀怪最多的两天。

    有人可能会卡在这一步,觉得不好理解。可以结合第二步来看,虽然分组后看不到重复,但是通过函数可以计算出来。

    再放个图(没加HAVING COUNT(*) <= 2的时候,而且增加count列,方便理解),还不懂就没救了。

    http://img1.mukewang.com/5e17bfb100019e2504010232.jpg

    5.ORDER BY c.user_name, c.kills DESC,排序就不用解释了吧。

    慕祈

    如有两条杀敌数记录都是10,那么猪八戒最后只会查询到杀敌数12的记录,10记录的count肯定大于2然后被过滤掉

    2022-11-30 23:22:35

    共 2 条回复 >

MySQL开发技巧(一)

DBA和开发人员都必备的技能,SQL技巧一个好程序员必备技能

148779 学习 · 123 问题

查看课程

相似问题