LeetCode-1098. 小众书籍(中等)

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

知识点:

发布了118 篇原创文章 · 获赞 2 · 访问量 4888

猜你喜欢

转载自blog.csdn.net/Hello_JavaScript/article/details/104416194