我是一名立志把细节说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持
原题
表:Visits
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| visit_id | int |
| customer_id | int |
+-------------+---------+
visit_id
是该表中具有唯一值的列。
该表包含有关光临过购物中心的顾客的信息。
表:Transactions
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| transaction_id | int |
| visit_id | int |
| amount | int |
+----------------+---------+
transaction_id
是该表中具有唯一值的列。
此表包含 visit_id
期间进行的交易的信息。
有一些顾客可能光顾了购物中心但没有进行交易。请你编写一个解决方案,来查找这些顾客的 ID ,以及他们只光顾不交易的次数。
返回以 任何顺序 排序的结果表。
返回结果格式如下例所示。
示例 1:
输入:
Visits
+----------+-------------+
| visit_id | customer_id |
+----------+-------------+
| 1 | 23 |
| 2 | 9 |
| 4 | 30 |
| 5 | 54 |
| 6 | 96 |
| 7 | 54 |
| 8 | 54 |
+----------+-------------+
Transactions
+----------------+----------+--------+
| transaction_id | visit_id | amount |
+----------------+----------+--------+
| 2 | 5 | 310 |
| 3 | 5 | 300 |
| 9 | 5 | 200 |
| 12 | 1 | 910 |
| 13 | 2 | 970 |
+----------------+----------+--------+
输出:
+-------------+----------------+
| customer_id | count_no_trans |
+-------------+----------------+
| 54 | 2 |
| 30 | 1 |
| 96 | 1 |
+-------------+----------------+
解释:
ID = 23 的顾客曾经逛过一次购物中心,并在 ID = 12 的访问期间进行了一笔交易。
ID = 9 的顾客曾经逛过一次购物中心,并在 ID = 13 的访问期间进行了一笔交易。
ID = 30 的顾客曾经去过购物中心,并且没有进行任何交易。
ID = 54 的顾客三度造访了购物中心。在 2 次访问中,他们没有进行任何交易,在 1 次访问中,他们进行了 3 次交易。
ID = 96 的顾客曾经去过购物中心,并且没有进行任何交易。
如我们所见,ID 为 30 和 96 的顾客一次没有进行任何交易就去了购物中心。顾客 54 也两次访问了购物中心并且没有进行任何交易。
题解
寻找白嫖怪。
解法一:
SELECT customer_id, count(v.customer_id) AS count_no_trans
FROM Visits v
WHERE visit_id NOT IN
(SELECT DISTINCT visit_id FROM Transactions)
GROUP BY customer_id;
解法二:
SELECT customer_id, count(v.customer_id) AS count_no_trans
FROM Visits v
LEFT JOIN Transactions t
ON V.visit_id = T.visit_id
WHERE transaction_id IS NULL
GROUP BY customer_id;
解题笔记
解法一:
解题思路比较直接,将所有的用户ID和购买的用户ID的比较,不是购买用户就是白嫖怪。
COUNT()
函数计算次数。AS
起别名。DISTINCT
过滤重复数据。- 关键字详解,请看文章:【MySQL】查询数据,过滤重复结果数据(关键字:DISTINCT)
GROUP BY
分组。- 关键字详解,请看文章:【MySQL】数据分组(关键字:GROUP BY)过滤分组(关键字:HAVING)
解法二:
解题思路:使用连表查询查出所有访问信息,在访问记录没有对应的购买记录的数据,就是我们要找的数据,再加以过滤统计。
+----------+-------------+----------------+----------+--------+
| visit_id | customer_id | transaction_id | visit_id | amount |
+----------+-------------+----------------+----------+--------+
| 1 | 23 | 12 | 1 | 910 |
| 2 | 9 | 13 | 2 | 970 |
| 4 | 30 | null | null | null |
| 5 | 54 | 2 | 5 | 310 |
| 5 | 54 | 3 | 5 | 300 |
| 5 | 54 | 9 | 5 | 200 |
| 6 | 96 | null | null | null |
| 7 | 54 | null | null | null |
| 8 | 54 | null | null | null |
+----------+-------------+----------------+----------+--------+
COUNT()
函数计算次数。AS
起别名。LEFT JOIN
GROUP BY
分组。- 关键字详解,请看文章:【MySQL】数据分组(关键字:GROUP BY)过滤分组(关键字:HAVING)
我是一名立志把细节说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持