前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySql场景面试题:电商购物中最贵及购买次数最多的商品

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

作者头像
公众号:码到三十五
发布于 2025-01-16 00:10:17
发布于 2025-01-16 00:10:17
15400
代码可运行
举报
文章被收录于专栏:设计模式设计模式
运行总次数:0
代码可运行

场景描述

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

  1. orders:存储订单信息。
  2. order_items:存储订单中的商品信息。
  3. products:存储商品信息。

表结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 订单表
CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE,
    customer_id INT
);

-- 商品表
CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(50),
    category VARCHAR(50),
    price DECIMAL(10, 2)
);

-- 订单商品表
CREATE TABLE order_items (
    order_item_id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT,
    product_id INT,
    quantity INT,
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

插入测试数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 插入订单数据
INSERT INTO orders (order_date, customer_id) VALUES
('2023-10-01', 1),
('2023-10-02', 2),
('2023-10-03', 1),
('2023-10-04', 3),
('2023-10-05', 2);

-- 插入商品数据
INSERT INTO products (product_name, category, price) VALUES
('Laptop', 'Electronics', 1200.00),
('Smartphone', 'Electronics', 800.00),
('Headphones', 'Electronics', 150.00),
('Coffee Maker', 'Home Appliances', 100.00),
('Blender', 'Home Appliances', 80.00);

-- 插入订单商品数据
INSERT INTO order_items (order_id, product_id, quantity) VALUES
(1, 1, 1), -- Laptop
(1, 3, 2), -- Headphones
(2, 2, 1), -- Smartphone
(3, 4, 1), -- Coffee Maker
(4, 5, 1), -- Blender
(5, 1, 1), -- Laptop
(5, 2, 1); -- Smartphone
面试题

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

  1. 统计每个客户的以下信息:
    • customer_id
    • total_spent(该客户的总消费金额)
    • most_expensive_order(该客户最贵的一笔订单的金额)
    • favorite_category(该客户购买次数最多的商品类别)
  2. 只统计消费金额超过 1000 的客户。
  3. total_spent 从高到低排序。
预期结果

上述数据,查询结果应该类似:

customer_id

total_spent

most_expensive_order

favorite_category

1

1700.00

1500.00

Electronics

2

2080.00

2000.00

Electronics

解题思路
  1. 计算每个客户的总消费金额
    • 使用 orders 表和 order_items 表关联,计算每个订单的总金额,再按客户分组求和。
  2. 计算每个客户最贵的一笔订单的金额
    • 使用 MAX() 聚合函数和子查询,计算每个客户最贵的一笔订单的金额。
  3. 计算每个客户购买次数最多的商品类别
    • 使用 COUNT()GROUP BY 统计每个客户购买的商品类别次数,再使用窗口函数 ROW_NUMBER()RANK() 找到购买次数最多的类别。
  4. 过滤消费金额超过 1000 的客户
    • 使用 HAVING 条件过滤总消费金额超过 1000 的客户。
SQL 实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 第一步:计算每个客户的总消费金额和最贵的一笔订单金额
WITH customer_spending AS (
    SELECT
        o.customer_id,
        SUM(oi.quantity * p.price) AS total_spent,
        MAX(oi.quantity * p.price) AS most_expensive_order
    FROM
        orders o
    JOIN order_items oi ON o.order_id = oi.order_id
    JOIN products p ON oi.product_id = p.product_id
    GROUP BY
        o.customer_id
    HAVING
        total_spent > 1000
),

-- 第二步:计算每个客户购买次数最多的商品类别
favorite_category AS (
    SELECT
        o.customer_id,
        p.category,
        COUNT(*) AS category_count,
        ROW_NUMBER() OVER (PARTITION BY o.customer_id ORDER BY COUNT(*) DESC) AS category_rank
    FROM
        orders o
    JOIN order_items oi ON o.order_id = oi.order_id
    JOIN products p ON oi.product_id = p.product_id
    GROUP BY
        o.customer_id, p.category
)

-- 第三步:整合结果并排序
SELECT
    cs.customer_id,
    cs.total_spent,
    cs.most_expensive_order,
    fc.category AS favorite_category
FROM
    customer_spending cs
JOIN favorite_category fc ON cs.customer_id = fc.customer_id
WHERE
    fc.category_rank = 1
ORDER BY
    cs.total_spent DESC;
考察点
  1. 聚合函数
    • 使用 SUM() 计算总消费金额,使用 MAX() 计算最贵的一笔订单金额,使用 COUNT() 统计购买次数。
  2. 窗口函数
    • 使用 ROW_NUMBER() 计算每个客户购买次数最多的商品类别。
  3. 子查询和 CTE(Common Table Expressions)
    • 使用 WITH 子句将复杂查询分解为多个步骤,提高可读性。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 场景描述
    • 面试题
    • 预期结果
    • SQL 实现
    • 考察点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档