2022年10月更文挑战30-12-leetcode刷题1158-市场分析1

88 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

leetcode刷题1158-市场分析1

前文

本文内容为leetcode数据库类型题目,主要考查对于查询相关知识的掌握。本文解题方案为个人理解,并非最佳解决方案。该题目序号为1158,题目链接为leetcode.cn/problems/ma…

题目信息

Table: Users

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| user_id        | int     |
| join_date      | date    |
| favorite_brand | varchar |
+----------------+---------+

此表主键是 user_id。 表中描述了购物网站的用户信息,用户可以在此网站上进行商品买卖。  

Table: Orders

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| order_id      | int     |
| order_date    | date    |
| item_id       | int     |
| buyer_id      | int     |
| seller_id     | int     |
+---------------+---------+

此表主键是 order_id。 外键是 item_id 和(buyer_id,seller_id)。  

Table: Items

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| item_id       | int     |
| item_brand    | varchar |
+---------------+---------+

此表主键是 item_id。  

请写出一条SQL语句以查询每个用户的注册日期和在 2019 年作为买家的订单总数。

题目分析

根据题目所给的信息,我们有三张表,分别是订单表、用户表以及订单项目表,本题目与订单项目表无关联,因此忽略即可。我们需要查询出每个用户的注册日期以及他们在2019年购买的订单总数。很容易联想到两表关联,但是有一点必须要注意,用户可能存在但其在2019年并没有进行购买行为,这种情况依然需要将用户显示在查询的结果中,且用户在2019年的订单数目显示为0。因此我们在进行两表关联时,需要将用户表作为主表,采用用户表left join订单表的方式进行数据表的关联。另外我们想要聚合每个用户在2019年实际购买的订单数,则需要我们针对用户id进行分组处理。这里注意要采用用户表的字段而不是订单表的字段,因为订单表的字段可能为空。至此,本题目解答完毕。

解题答案

select b.user_id as buyer_id,b.join_date,count(a.buyer_id) as orders_in_2019
from Users b 
left join Orders a
on a.buyer_id = b.user_id
and a.order_date >= '2019-01-01' and a.order_date <= '2019-12-31'
group by
b.user_id,b.join_date

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。