首页 > 数据库 >力扣1098(MySQL)-小众书籍(中等)

力扣1098(MySQL)-小众书籍(中等)

时间:2023-04-11 11:59:57浏览次数:45  
标签:10 06 1098 力扣 book 2019 MySQL id

题目:

书籍表 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

注意:

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

标签:10,06,1098,力扣,book,2019,MySQL,id
From: https://www.cnblogs.com/liu-myu/p/17305745.html

相关文章

  • MySQL 5.6.39 修改 root 密码不生效
    记一次MySQL 修改 root 密码不生效的问题,修改密码后新密码不生效,依旧只能使用旧密码登录,改了个寂寞。一、版本MySQL5.6.39二、问题使用 update 命令修改密码:updateusersetpassword=password('新密码')whereuser='root'andhost='%';刷新权限:flushprivilege......
  • MySQL主从复制原理剖析与应用实践
    vivo互联网服务器团队-ShangYongxingMySQLReplication(主从复制)是指数据变化可以从一个MySQLServer被复制到另一个或多个MySQLServer上,通过复制的功能,可以在单点服务的基础上扩充数据库的高可用性、可扩展性等。一、背景MySQL在生产环境中被广泛地应用,大量的应用和服务......
  • MySql8.0修改root密码
    MySQL5.7 的版本,因为在user表中没有password字段,一直使用下边的方式来修改root密码usemysql;updateusersetauthentication_string=password('root') whereuser='root'现在要用MySQL8.0.11版本,装好MySQL后用上边方法修改密码,一直报错。后来去掉password()函数后,没有报......
  • MySQL函数
    HEX[[email protected]][test]>select16,HEX(16);+----+---------+|16|HEX(16)|+----+---------+|16|10|+----+---------+1rowinset(0.00sec) CAST[[email protected]][test]>createtabletest_col_sort(userchar(10),typeenum(�......
  • 使用Mysql实现消息队列
    实现起来就是消息带状态和版本号字段。更新时用版本号做乐观锁。操作逻辑就是个状态机。UPDATEmqSETmq.status=new_statusmq.version=mq.version+1WHEREmq.version=old_version实现mysqlmq表结构设计CREATETABLE`mq`(`id`bigint(20)unsigned......
  • mysql数据库的登录脚本
    ######################## ku脚本:可以使用以下ku脚本,它可以根据提供的参数登录到MySQL数据库:#!/bin/bash#Checkforcorrectnumberofargumentsif[$#-lt1];thenecho"Usage:$0<ip>[<port>][<mysqloptions>]"exit1fi#SettheIPaddress......
  • 力扣 674. 最长连续递增序列
    674.最长连续递增序列给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。连续递增的子序列 可以由两个下标 l 和 r(l<r)确定,如果对于每个 l<=i<r,都有 nums[i]<nums[i+1] ,那么子序列 [nums[l],nums[l+1],...,nums[r-1],......
  • chatpgt-flinkcdc从mysql到kafka再到mysql
    flinkcdcmysql到kafkaimportorg.apache.flink.api.common.serialization.SimpleStringSchema;importorg.apache.flink.streaming.api.environment.StreamExecutionEnvironment;importorg.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer;importorg.apach......
  • 学习笔记394—Windows 10 MySQL 数据库安装
    Windows10MySQL数据库安装1、MySQL的安装方式MySQL的社区版(MySQLCommunity)是免费的、开源的,像企业版这些是收费的,学习阶段使用社区版的即可。MySQL社区版在Windows10的安装方式可以分为两种,一种是使用安装程序安装,另一种是使用压缩包安装。个人倾向于使用压缩包......
  • Mysql tinyint长度为1时在java中被转化成boolean型(踩坑)
    资料参考链接1:https://www.cnblogs.com/joeylee/p/3878223.html资料参考链接2:https://blog.csdn.net/HD243608836/article/details/118197811目录背景线上事故1污染数据2类型转换异常原因解决方法.背景踩过两次tinyint的坑线上事故1污染数据问题背景tinyint(1)在j......