书籍表 Books:
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| book_id | int |
| name | varchar |
| available_from | date |
+----------------+---------+
book_id 是这个表的主键。
订单表 Orders:
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| order_id | int |
| book_id | int |
| quantity | int |
| dispatch_date | date |
+----------------+---------+
order_id 是这个表的主键。
book_id 是 Books 表的外键。
你需要写一段 SQL 命令,筛选出过去一年中订单总量 少于10本 的 书籍 。
注意:不考虑 上架(available from)距今 不满一个月 的书籍。并且 假设今天是 2019-06-23 。
下面是样例输出结果:
Books 表:
+---------+--------------------+----------------+
| book_id | name | available_from |
+---------+--------------------+----------------+
| 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 |
+---------+--------------------+----------------+
Orders 表:
+----------+---------+----------+---------------+
| order_id | book_id | quantity | dispatch_date |
+----------+---------+----------+---------------+
| 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 |
+----------+---------+----------+---------------+
Result 表:
+-----------+--------------------+
| book_id | name |
+-----------+--------------------+
| 1 | "Kalila And Demna" |
| 2 | "28 Letters" |
| 5 | "The Hunger Games" |
+-----------+--------------------+
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unpopular-books
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
审题:
思考:
解题:
解法一
先过滤掉最近1个月才开卖的书。
结果集命名为表A。
(
select *
from books as B
where B.available_from <= DATE('2019-05-23')
) AS A
连接表A和订单表。用left join。排除掉2018-06-23到2019-06-23之外的订单。
SELECT *
from
(
select *
from books as B
where B.available_from <= '2019-05-23'
) AS A
left join orders as O
on (A.book_id = O.book_id and O.dispatch_date BETWEEN '2018-06-23' AND '2019-06-23');
再按A.book_id分组,输出销售量少于10个的书。
select A.book_id,max(A.NAME) AS `name`
from
(
select *
from books as B
where B.available_from <= DATE('2019-05-23')
) AS A
left join orders as O
on (A.book_id = O.book_id and O.dispatch_date BETWEEN DATE('2018-06-23') AND DATE('2019-06-23'))
group by A.book_id
HAVING SUM(if(O.quantity IS NULL,0,O.quantity)) < 10
解法二
直接连接书表和订单表。 用left join。排除掉2018-06-23到2019-06-23之外的订单。
再排除掉 最近1个月才开卖的书。
SELECT *
FROM
books AS B
LEFT JOIN orders AS O ON (B.book_id = O.book_id AND O.dispatch_date BETWEEN DATE('2018-06-23') AND DATE('2019-06-23'))
WHERE B.available_from <= DATE('2019-05-23')
再按A.book_id分组,输出销售量少于10个的书。
SELECT B.book_id, MAX(B.NAME) AS `name`
FROM
books AS B
LEFT JOIN orders AS O ON (B.book_id = O.book_id AND O.dispatch_date BETWEEN DATE('2018-06-23') AND DATE('2019-06-23'))
WHERE B.available_from <= DATE('2019-05-23')
GROUP BY B.book_id
HAVING SUM(IF(O.quantity IS NULL,0,O.quantity)) < 10
知识点: