题目1:游戏玩法分析
- 题目要求: 获取每一个玩家的第一次登录平台的日期
- 处理思路:第一次登录平台的日期, 竟然是第一次登录平台的日期, 那也就是对应的player_id中最小的event_date 了, 所以思路出来了, 直接一个聚合查询查询min(date) 即可
- 如何想到使用聚合查询, 首先存在多个登录日期, 但是我们仅仅需要最小的哪一个, 于是想到了通过聚合查询进行压缩处理, 结合一下聚合函数使用即可,常用的聚合函数附在如下
select player_id, min(event_date) as 'first_login' from activity group by player_id;
题目2:订单最多的客户
- 题目要求: 获取订单最多的客户
思考方向: 我们需要获取订单数最多的客户, 首先第一步就是计算出来订单数, 计算订单数自然需要聚合查询, count(customer_number) 或者 count(*) 来获取订单数, 然后直接按照订单数从大到小排序, 第一条就是需要的max 订单数客户 (获取最大,第几大, 第几小 一定想到 sort + limit分页)
select customer_number from orders group by customer_number order by count(*) desc limit 0, 1; # 获取第一条记录
题目3: 大的国家
- 题目要求: 需要我们按照如下规则筛选出来大国
- 解题思路: 特别的简单, 直接一个where 条件查询筛选大国即可实现
select name, population, area from world where area >= 3000000 or population >= 25000000; -- where 条件筛选大国
题目4:连续出现的数字
- 题目要求:1. 连续出现 2. 出现三次
- 因为需要从同一张表中找,只有一张表, 关系是表中连续三次出现的重复num的记录, 所以其实很容易想到可以通过自联结查询. 然后查询的过程中肯定会出现重复, 因为相当于是同一张表自己跟自己连接两次. 故而需要进行一个distinct
select distinct l1.num as 'ConsecutiveNums' -- 'consecutivenums'题目要求别名 from logs l1 inner join logs l2 on l1.num = l2.num inner join logs l3 on l1.num = l3.num # 子连接关系条件满足同一个num where l1.id = l2.id + 1 && l2.id = l3.id + 1; -- where条件保证连续记录
题目小结
- 查找重复出现记录数我们需要想到 聚合查询, 因为聚合查询可以做到压缩相同关键字聚合操作。
- 查找第几大或者小记录 我们需要想到可以使用 sort + limit 分页
- 多表连接操作不限表的数量, 甚至可以三表,四表同时连接,只是数量过多之后一般不建议这样书写了,需要另辟蹊径, 因为你写都写不下了