网络知识 娱乐 数据库LeetCode每日练习(三)

数据库LeetCode每日练习(三)

目录

前言

题目1:游戏玩法分析

题目2:订单最多的客户

题目3: 大的国家

题目4:连续出现的数字

题目小结


前言

  • 回顾前文精彩片段

数据库LeetCode每日练习(一)_小杰312的博客-CSDN博客sql操作LeetCode每日练习https://blog.csdn.net/weixin_53695360/article/details/123985354?spm=1001.2014.3001.5501数据库LeetCode每日练习(二)_小杰312的博客-CSDN博客数据库LeetCode每日练习(二)https://blog.csdn.net/weixin_53695360/article/details/124020795?spm=1001.2014.3001.5501

题目1:游戏玩法分析

511. 游戏玩法分析 I

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

  • 题目要求: 获取每一个玩家的第一次登录平台的日期
  • 处理思路:第一次登录平台的日期, 竟然是第一次登录平台的日期, 那也就是对应的player_id中最小的event_date 了, 所以思路出来了,  直接一个聚合查询查询min(date) 即可   
  • 如何想到使用聚合查询, 首先存在多个登录日期, 但是我们仅仅需要最小的哪一个, 于是想到了通过聚合查询进行压缩处理,   结合一下聚合函数使用即可,常用的聚合函数附在如下

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

select 
    player_id,
    min(event_date) as 'first_login'  
from 
    activity
group by 
    player_id;

题目2:订单最多的客户

586. 订单最多的客户

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_14,color_FFFFFF,t_70,g_se,x_16

  •  题目要求: 获取订单最多的客户
  • 思考方向: 我们需要获取订单数最多的客户, 首先第一步就是计算出来订单数, 计算订单数自然需要聚合查询, count(customer_number) 或者 count(*) 来获取订单数, 然后直接按照订单数从大到小排序, 第一条就是需要的max 订单数客户       (获取最大,第几大, 第几小 一定想到 sort  +  limit分页)
select 
    customer_number
from 
    orders
group by customer_number
order by count(*) desc
limit 0, 1; # 获取第一条记录

题目3: 大的国家

595. 大的国家

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

  •  题目要求: 需要我们按照如下规则筛选出来大国

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

  •  解题思路: 特别的简单, 直接一个where 条件查询筛选大国即可实现
select 
    name, population, area
from 
    world
where 
    area >= 3000000 or population >= 25000000;
-- where 条件筛选大国

题目4:连续出现的数字

180. 连续出现的数字

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_17,color_FFFFFF,t_70,g_se,x_16

  • watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_13,color_FFFFFF,t_70,g_se,x_16
  • 题目要求: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 分页
  • 多表连接操作不限表的数量, 甚至可以三表,四表同时连接,只是数量过多之后一般不建议这样书写了,需要另辟蹊径, 因为你写都写不下了