MySql场景面试题:电商购物中最贵及购买次数最多的商品 ...

打印 上一主题 下一主题

主题 881|帖子 881|积分 2643

❃博主首页 :   「码到三十五」   ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」   
  ☠博主专栏 :   <mysql高手>    <elasticsearch高手>    <源码解读>    <java核心>    <面试攻关>   
  ♝博主的话 :  搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基   
场景描述

电商系统,数据库中有以下表:

  • orders 表:存储订单信息。
  • order_items 表:存储订单中的商品信息。
  • products 表:存储商品信息。
表结构如下:
  1. -- 订单表
  2. CREATE TABLE orders (
  3.     order_id INT AUTO_INCREMENT PRIMARY KEY,
  4.     order_date DATE,
  5.     customer_id INT
  6. );
  7. -- 商品表
  8. CREATE TABLE products (
  9.     product_id INT AUTO_INCREMENT PRIMARY KEY,
  10.     product_name VARCHAR(50),
  11.     category VARCHAR(50),
  12.     price DECIMAL(10, 2)
  13. );
  14. -- 订单商品表
  15. CREATE TABLE order_items (
  16.     order_item_id INT AUTO_INCREMENT PRIMARY KEY,
  17.     order_id INT,
  18.     product_id INT,
  19.     quantity INT,
  20.     FOREIGN KEY (order_id) REFERENCES orders(order_id),
  21.     FOREIGN KEY (product_id) REFERENCES products(product_id)
  22. );
复制代码
插入测试数据:
  1. -- 插入订单数据
  2. INSERT INTO orders (order_date, customer_id) VALUES
  3. ('2023-10-01', 1),
  4. ('2023-10-02', 2),
  5. ('2023-10-03', 1),
  6. ('2023-10-04', 3),
  7. ('2023-10-05', 2);
  8. -- 插入商品数据
  9. INSERT INTO products (product_name, category, price) VALUES
  10. ('Laptop', 'Electronics', 1200.00),
  11. ('Smartphone', 'Electronics', 800.00),
  12. ('Headphones', 'Electronics', 150.00),
  13. ('Coffee Maker', 'Home Appliances', 100.00),
  14. ('Blender', 'Home Appliances', 80.00);
  15. -- 插入订单商品数据
  16. INSERT INTO order_items (order_id, product_id, quantity) VALUES
  17. (1, 1, 1), -- Laptop
  18. (1, 3, 2), -- Headphones
  19. (2, 2, 1), -- Smartphone
  20. (3, 4, 1), -- Coffee Maker
  21. (4, 5, 1), -- Blender
  22. (5, 1, 1), -- Laptop
  23. (5, 2, 1); -- Smartphone
复制代码

面试题

请编写一个 SQL 查询,实现以下需求:

  • 统计每个客户的以下信息:

    • customer_id
    • total_spent(该客户的总消费金额)
    • most_expensive_order(该客户最贵的一笔订单的金额)
    • favorite_category(该客户购买次数最多的商品类别)

  • 只统计消费金额高出 1000 的客户。
  • 按 total_spent 从高到低排序。

预期效果

上述数据,查询效果应该类似:
customer_idtotal_spentmost_expensive_orderfavorite_category11700.001500.00Electronics22080.002000.00Electronics
解题思绪


  • 计算每个客户的总消费金额

    • 使用 orders 表和 order_items 表关联,计算每个订单的总金额,再按客户分组求和。

  • 计算每个客户最贵的一笔订单的金额

    • 使用 MAX() 聚合函数和子查询,计算每个客户最贵的一笔订单的金额。

  • 计算每个客户购买次数最多的商品类别

    • 使用 COUNT() 和 GROUP BY 统计每个客户购买的商品类别次数,再使用窗口函数 ROW_NUMBER() 或 RANK() 找到购买次数最多的类别。

  • 过滤消费金额高出 1000 的客户

    • 使用 HAVING 条件过滤总消费金额高出 1000 的客户。


SQL 实现

  1. -- 第一步:计算每个客户的总消费金额和最贵的一笔订单金额
  2. WITH customer_spending AS (
  3.     SELECT
  4.         o.customer_id,
  5.         SUM(oi.quantity * p.price) AS total_spent,
  6.         MAX(oi.quantity * p.price) AS most_expensive_order
  7.     FROM
  8.         orders o
  9.     JOIN order_items oi ON o.order_id = oi.order_id
  10.     JOIN products p ON oi.product_id = p.product_id
  11.     GROUP BY
  12.         o.customer_id
  13.     HAVING
  14.         total_spent > 1000
  15. ),
  16. -- 第二步:计算每个客户购买次数最多的商品类别
  17. favorite_category AS (
  18.     SELECT
  19.         o.customer_id,
  20.         p.category,
  21.         COUNT(*) AS category_count,
  22.         ROW_NUMBER() OVER (PARTITION BY o.customer_id ORDER BY COUNT(*) DESC) AS category_rank
  23.     FROM
  24.         orders o
  25.     JOIN order_items oi ON o.order_id = oi.order_id
  26.     JOIN products p ON oi.product_id = p.product_id
  27.     GROUP BY
  28.         o.customer_id, p.category
  29. )
  30. -- 第三步:整合结果并排序
  31. SELECT
  32.     cs.customer_id,
  33.     cs.total_spent,
  34.     cs.most_expensive_order,
  35.     fc.category AS favorite_category
  36. FROM
  37.     customer_spending cs
  38. JOIN favorite_category fc ON cs.customer_id = fc.customer_id
  39. WHERE
  40.     fc.category_rank = 1
  41. ORDER BY
  42.     cs.total_spent DESC;
复制代码

考察点


  • 聚合函数

    • 使用 SUM() 计算总消费金额,使用 MAX() 计算最贵的一笔订单金额,使用 COUNT() 统计购买次数。

  • 窗口函数

    • 使用 ROW_NUMBER() 计算每个客户购买次数最多的商品类别。

  • 子查询和 CTE(Common Table Expressions)

    • 使用 WITH 子句将复杂查询分解为多个步骤,进步可读性。


    关注公众号[码到三十五]获取更多技术干货 !   


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表