题目:

书籍表 Books:

book_id 是这个表的主键

订单表 Orders:

order_id 是这个表的主键。
book_id 是 Books 表的外键。

问题
你需要写一段 SQL 命令,筛选出过去一年中订单总量 少于10本 的 书籍 。

注意:不考虑 上架(available from)距今 不满一个月 的书籍。并且 假设今天是 2019-06-23 。

示例
Books 表:

Orders 表:

Result 表:

建表语句:

1 Create table If Not Exists Books_1098 (book_id int, name varchar(50), available_from date);
2 Create table If Not Exists Orders_1098 (order_id int, book_id int, quantity int, dispatch_date date);
3 Truncate table Books_1098;
4 insert into Books_1098 (book_id, name, available_from) values ('1', 'Kalila And Demna', '2010-01-01'), ('2', '28 Letters', '2012-05-12'),('3', 'The Hobbit', '2019-06-10'),('4', '13 Reasons Why', '2019-06-01'), ('5', 'The Hunger Games', '2008-09-21');
5 Truncate table Orders_1098;
6 insert into Orders_1098 (order_id, book_id, quantity, dispatch_date) values ('1', '1', '2', '2018-07-26'),('2', '1', '1', '2018-11-05'),('3', '3', '8', '2019-06-11'),('4', '4', '6', '2019-06-05'),('5', '4', '5', '2019-06-20'),('6', '5', '9', '2009-02-02'),('7', '5', '8', '2010-04-13');

 解题思路:

方法一:

①先筛选出Orders 表过去一年的出售数大于10的book_id

1 select book_id
2 from orders_1098
3 where dispatch_date between '2018-06-23' and '2019-06-23'
4 group by book_id
5 having sum(quantity) > 10

②再去books表中筛选出 出版日期大于1个月且不在上一步筛选出的book_id 的book_id 和 name

1 select book_id,name
2 from books_1098
3 where book_id not in (
4 select book_id
5 from orders_1098
6 where dispatch_date between '2018-06-23' and '2019-06-23'
7 group by book_id
8 having sum(quantity) > 10
9 ) and available_from <= '2019-05-23'

方法二:

用on 筛选出orders表中订单时间小于一年的数据进行左连接books表,然后where筛选出 出版时间大于一个月的数据,再以book_id进行分组,使用having 筛选出出售数量小于10,最后select出book_id和name。

注意:

因为on去筛选,没有订单的至少返回null;而不符合where条件的,连null都不会保留。所以不满一个月应放在where后,过去一年中应放在on后。

1 select a.book_id,name
2 from books_1098 a
3 left join orders_1098 b
4 on a.book_id = b.book_id and datediff('2019-06-23',dispatch_date) <= 365
5 where datediff('2019-06-23',available_from) >= 30
6 group by a.book_id
7 having ifnull(sum(quantity),0) < 10

注意:

这道题力扣需要会员,故题解仅测试数据正确,不知道力扣是否能通过,如果有老师看到这篇博客,如果有问题不通过麻烦给我说一下,谢谢老师~

力扣1098(MySQL)-小众书籍(中等)的更多相关文章

  1. 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题

    题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...

  2. 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度

    题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...

  3. 力扣1052. 爱生气的书店老板-C语言实现-中等难度

    题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...

  4. 力扣---1148. 文章浏览 I

    Views 表:+---------------+---------+| Column Name   | Type    |+---------------+---------+| article_i ...

  5. 力扣---511. 游戏玩法分析 I

    活动表 Activity: +--------------+---------+| Column Name  | Type    |+--------------+---------+| player ...

  6. 力扣算法题—069x的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

  7. JS数据结构第六篇 --- 二叉树力扣练习题

    1.第226题:翻转二叉树 递归+迭代两种实现方式: /** 反转二叉树 * Definition for a binary tree node. * function TreeNode(val) { ...

  8. 力扣(LeetCode)删除排序链表中的重复元素II 个人题解

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...

  9. C++双指针滑动和利用Vector实现无重复字符的最长子串—力扣算法

    题目: 力扣原题链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 给定一个字符串, ...

  10. LeetCode 1244. 力扣排行榜

    地址 https://www.acwing.com/solution/LeetCode/content/5765/ 题目描述新一轮的「力扣杯」编程大赛即将启动,为了动态显示参赛者的得分数据,需要设计一 ...

随机推荐

  1. stm32 boot0硬件接法导致的概率性启动失败问题总结和反思

    概要  问题概要,板子在稳压电源上工作很好,可一旦接了电池,stm32就会出现概率性的无法启动.加上项目比较急,这个问题阻塞一直无法量产.真是非常的要命啊. 思路分析  既然是不同的电源会导致这个问题 ...

  2. vue基础知识和原理(二)

    1.13 列表渲染 v-for指令 用于展示列表数据 语法:v-for="(item, index) in xxx" :key="yyy" 可遍历:数组.对象. ...

  3. 配置Tomcat服务器

    一:修改服务器端口 访问tomcat主页的时候,输入的是localhost:8080,说明tomcat的端口是8080,那么怎么修改端口号呢? 我们要先认识配置文件 用浏览器打开tomcat下conf ...

  4. 记录--关于前端的音频可视化-Web Audio

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 最近听音乐的时候,看到各种动效,突然好奇这些音频数据是如何获取并展示出来的,于是花了几天功夫去研究相关的内容,这里只是给大家一些代码 ...

  5. 记录--uniapp开发安卓APP视频通话模块初实践

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 视频通话SDK用的即构的,uniapp插件市场地址 推送用的极光的,uniapp插件市场地址 即构音视频SDK uniapp插件市场的貌似 ...

  6. 镭速Raysync v6.6.8.0版本发布

    最近镭速发布了v6.6.8.0版本,已经发布上线了.主要更新内容有服务器下发任务支持指定客户端,客户端增加日志清理和日志压缩,自动删除源文件保持源目录结构,支持将文件投递给其他成员等功能,详细的更新内 ...

  7. FastJson反序列化1-FastJson基础使用及反序列化流程分析

    1.FastJson简介及使用 fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到Java ...

  8. ZYNQ7000系列学习之TF卡读写(2)

    ZYNQ读写实验(2) 1.实验原理 在TF卡读写实验1中,已经将每一个步骤都做完了,但是最后得到的结果是错误的.那个时候由于TF没有格式化,显示的是错误信息.在格式化后,再次实验,得到了预期的结果. ...

  9. Flux中的map、flatMap、concatMap的区别

    flatMap.map和concatMap都是在Flux中用于进行数据转换和处理的方法,但它们在处理元素和顺序上有一些区别: map方法: map方法用于对Flux中的每个元素进行一对一的转换. 对于 ...

  10. 关于 ThreadLocal 你需要知道的几点

    一.ThreadLocal是什么? 一个类对象类型,提供属线程本地变量,也就是同一个变量对不同线程保存了不同的值,但是和线程自身定义的自属变量不同. 通常以私有静态类型定义,用以保存特定线程特定状态属 ...