LeetCode # 1158. 市场分析 I

1158. 市场分析 I

题目

表: Users

sql 复制代码
+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| user_id        | int     |
| join_date      | date    |
| favorite_brand | varchar |
+----------------+---------+
user_id 是此表主键(具有唯一值的列)。
表中描述了购物网站的用户信息,用户可以在此网站上进行商品买卖。

表: Orders

sql 复制代码
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| order_id      | int     |
| order_date    | date    |
| item_id       | int     |
| buyer_id      | int     |
| seller_id     | int     |
+---------------+---------+
order_id 是此表主键(具有唯一值的列)。
item_id 是 Items 表的外键(reference 列)。
(buyer_id,seller_id)是 User 表的外键。

表:Items

sql 复制代码
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| item_id       | int     |
| item_brand    | varchar |
+---------------+---------+
item_id 是此表的主键(具有唯一值的列)。

编写解决方案找出每个用户的注册日期和在 2019 年作为买家的订单总数。

以 任意顺序 返回结果表。

查询结果格式如下。

示例 1:

sql 复制代码
输入:
Users 表:
+---------+------------+----------------+
| user_id | join_date  | favorite_brand |
+---------+------------+----------------+
| 1       | 2018-01-01 | Lenovo         |
| 2       | 2018-02-09 | Samsung        |
| 3       | 2018-01-19 | LG             |
| 4       | 2018-05-21 | HP             |
+---------+------------+----------------+
Orders 表:
+----------+------------+---------+----------+-----------+
| order_id | order_date | item_id | buyer_id | seller_id |
+----------+------------+---------+----------+-----------+
| 1        | 2019-08-01 | 4       | 1        | 2         |
| 2        | 2018-08-02 | 2       | 1        | 3         |
| 3        | 2019-08-03 | 3       | 2        | 3         |
| 4        | 2018-08-04 | 1       | 4        | 2         |
| 5        | 2018-08-04 | 1       | 3        | 4         |
| 6        | 2019-08-05 | 2       | 2        | 4         |
+----------+------------+---------+----------+-----------+
Items 表:
+---------+------------+
| item_id | item_brand |
+---------+------------+
| 1       | Samsung    |
| 2       | Lenovo     |
| 3       | LG         |
| 4       | HP         |
+---------+------------+
输出:
+-----------+------------+----------------+
| buyer_id  | join_date  | orders_in_2019 |
+-----------+------------+----------------+
| 1         | 2018-01-01 | 1              |
| 2         | 2018-02-09 | 2              |
| 3         | 2018-01-19 | 0              |
| 4         | 2018-05-21 | 0              |
+-----------+------------+----------------+

分析

只需要两张表,对用户id分组,过滤2019年订单,可以使用year('2019-05-02')或left('2019-05-02', 4)都可以获取2019,但是有两个用户没有订单,所以连表时缺少两条数据,解决方法如下:

外连接时要注意where和on的区别,on是在连接构造临时表时执行的,不管on中条件是否成立都会返回主表(也就是left join左边的表)的内容,where是在临时表形成后执行筛选作用的,不满足条件的整行都会被过滤掉。如果这里用的是 where year(order_date)='2019' 那么得到的结果将会把不满足条件的user_id为3,4的行给删掉。用on的话会保留user_id为3,4的行。

select user_id as buyer_id, join_date, count(order_id) as orders_in_2019
from Users as u left join Orders as o on u.user_id = o.buyer_id and year(order_date)='2019'
group by user_id

或者可以先用where对Orders表进行筛选

select user_id as buyer_id, join_date, count(order_id) as orders_in_2019
from Users as u left join (select * from Orders where year(order_date)='2019') as o on u.user_id = o.buyer_id 
group by user_id

题解

sql 复制代码
select u.user_id as buyer_id , u.join_date , count(o.order_id) as orders_in_2019  from users u left join orders o on u.user_id = o.buyer_id and year(o.order_date) = '2019' group by u.user_id 
# year(o.order_date) = '2019'  left(o.order_date, 4) = '2019'

使用ifnull

sql 复制代码
# 分步子查询,left join连接,使用ifnull列出不能匹配的数据
select Users.user_id as buyer_id, join_date, ifnull(UserBuy.cnt, 0) as orders_in_2019
from Users
left join (
    # 找到2019年订单的id和数量
    select buyer_id, count(order_id) cnt 
    from Orders
    where order_date between '2019-01-01' and '2019-12-31'
    group by buyer_id
) UserBuy
on Users.user_id = UserBuy.buyer_id
相关推荐
醇氧9 分钟前
【postgresql】模式(SCHEMA)
数据库·sql·postgresql
zengson_g17 分钟前
如何在 PostgreSQL 中实现数据的去重操作,尤其是对于复杂的数据结构?
数据库·postgresql
zengson_g18 分钟前
如何优化 PostgreSQL 中对于树形结构数据的查询?
数据库·postgresql
安於宿命18 分钟前
0/1背包问题总结
c语言·c++·算法·leetcode·动态规划
NingDream81619 分钟前
面试题 04. 二维数组中的查找
数据结构·算法
拾漓20 分钟前
算法整理——【贪心算法练习(2)】
算法·贪心算法
鞥牧魂人22 分钟前
数据库——事务管理
服务器·数据库·oracle
冯宝宝^34 分钟前
图书管理系统
服务器·数据库·vue.js·spring boot·后端
DdddJMs__13538 分钟前
C语言 | Leetcode C语言题解之第219题存在重复元素II
c语言·leetcode·题解
西邮彭于晏41 分钟前
差分进化算法
windows·python·算法