题目:

书籍表 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. 移远4G数传模块EC800M开发总结之基本备忘

    一 前记 1 EC800M模块是移远推出的小尺寸低功耗针对可穿戴市场的数传产品.笔者在几个产品上使用过程中,遇到了一些问题. 这里做个备忘吧. 二 梳理 1 工具,这个串口的默认波特率为115200. ...

  2. Python根据时间命名并创建文件源码

    自己写的,产品中验证ok的代码,直接上实例: import time def file_create_func(): loca = time.strftime('%Y-%m-%d-%H-%M-%S') ...

  3. Apollo3 Blue SoC 和 Apollo3 Blue Plus SoC的区别

    一 芯片简介 1.简介 Apollo3 Blue系列SoC解决方案代表了超低功耗设计的巨大飞跃,其运行模式和睡眠模式下的功耗数值均十分出色,并且具有高性能的处理引擎. Apollo3Blue器件提供了 ...

  4. pip 安装requirements.txt 的问题

    用新环境 在进行pip 安装的时候, 如果出现不进行安装 ,但是不报错就是满足条件,这个时候重新起一个shell,然后进行pip的安装.

  5. 一个简易的ORM框架的实现(一)

    一个简易的ORM框架的实现 ORM ORM---操作数据库---对象关系映射 ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节.只要提供了持久化类与 ...

  6. Winform DataGridView 添加复选框列

    1.编辑DataGridView的属性: 2.定义列的类型为chekcBox: 3.点击添加: 4.效果: 5.编辑:

  7. 毕设系列之Libx264实时视频流(YUV 420P转H264视频编码篇)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  8. 记录--vue3优雅的使用element-plus的dialog

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 如何优雅的基于 element-plus,封装一个梦中情 dialog 优点 摆脱繁琐的 visible 的命名,以及反复的重复 dom. ...

  9. Python 从MySQL数据库中把查询结果集写入到Excel

    import xlwt # 引入pymysql包 import pymysql # 连接数据库并打开library数据库 sql="SELECT * FROM\ user1;" c ...

  10. elasticsearch使用painless的一些简单例子

    目录 1.背景 2.准备数据 2.1 mapping 2.2 插入数据 3.例子 3.1 (update)更新文档 id=1 的文档,将 age 加 2岁 3.2 (update_by_query)如 ...