题目:

书籍表 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. vscode 对js文件不格式化的修正方案 settings.json

    修正1 "javascript.format.enable": true, // 这里false 改true 修正2 注释掉这个地方 // "[javascript]&q ...

  2. 【stars-one】JetBrains产品试用重置工具

    原文[stars-one]JetBrains产品试用重置工具 | Stars-One的杂货小窝 一款可重置JetBrains全家桶产品的试用时间的小工具,与其全网去找激活码,还不如每个月自己手动重置试 ...

  3. Winform DataGridView 添加复选框列

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

  4. 结构体、共用体与C++基础

    结构体.共用体与C++基础 1.结构体 结构体是C编程中一种用户自定义的数据类型,类似于Java的JavaBean //Student 相当于类名 //student和a 可以不定义,表示结构变量,也 ...

  5. grep 第四天

    grep 第四天 1 使用grep 取 passwd 显示行数 grep -c '' /etc/passwd [root@master ~]# grep -c '' /etc/passwd 135 2 ...

  6. 【LeetCode刷题】744. 寻找比目标字母大的最小字母

    744. 寻找比目标字母大的最小字母(点击跳转LeetCode) 给你一个排序后的字符列表 letters ,列表中只包含小写英文字母.另给出一个目标字母 target,请你寻找在这一有序列表里比目标 ...

  7. Spring Cloud相关组件说明

    1.Spring Cloud版本 现有Spring Cloud有两代实现,分为Spring Cloud Netflix和Spring Cloud Alibaba,由于SpringCloud Netfl ...

  8. RelationNet:学习目标间关系来增强特征以及去除NMS | CVPR 2018

    论文基于NLP的注意力机制提出了目标关系模块,通过与其它目标的比对增强当前目标的特征,而且还可以代替NMS进行端到端的重复结果去除,思想十分新颖,效果也不错   来源:晓飞的算法工程笔记 公众号 论文 ...

  9. FFmpeg开发笔记(九)Linux交叉编译Android的x265库

    ​<FFmpeg开发实战:从零基础到短视频上线>一书的"12.1.2  交叉编译Android需要的so库"介绍了如何在Windows环境交叉编译Android所需FF ...

  10. 安卓day_1

    今天买了安卓学习的相关书籍,在网站上找到了安卓学习的视频,了解了安卓学习的方向.