实现 MySQL 客户连续三个月复购的流程

要实现“客户连续三个月复购”的功能,我们需要通过对数据库的设计和查询实现这一目标。以下是整个流程的概述:

流程步骤详解

步骤 描述
1 设计数据库表结构
2 插入测试数据
3 编写 SQL 查询语句
4 解析查询结果,判断复购状态

1. 设计数据库表结构

首先,我们需要设计两张基础表:customers 表(储存客户信息)和 orders 表(储存订单信息)。

CREATE TABLE customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL
); -- 创建 customers 表,包含客户ID和名字

CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT,
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
); -- 创建 orders 表,存储订单信息并关联客户

2. 插入测试数据

接下来,我们需要向表中插入一些假数据以便于测试。

INSERT INTO customers (name) VALUES ('Alice'), ('Bob'), ('Charlie'); -- 插入客户测试数据

INSERT INTO orders (customer_id, order_date) VALUES
(1, '2023-01-10'), 
(1, '2023-02-15'), 
(1, '2023-03-05'),
(2, '2023-01-12'), 
(2, '2023-05-20'), 
(3, '2023-02-01'), 
(3, '2023-02-15'), 
(3, '2023-03-20'); -- 插入订单测试数据

3. 编写 SQL 查询语句

现在,我们需要编写 SQL 语句来找到连续三个月复购的客户。为此,我们需要使用 GROUP BYHAVING 子句来过滤结果。

SELECT 
    c.customer_id,
    c.name,
    COUNT(DISTINCT DATE_FORMAT(o.order_date, '%Y-%m')) AS monthly_count
FROM 
    customers c
JOIN 
    orders o ON c.customer_id = o.customer_id
WHERE 
    o.order_date >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH) -- 限制查询最近三个月的订单
GROUP BY 
    c.customer_id
HAVING 
    monthly_count = 3; -- 只选择复购了3个月的客户
  • 解释:
    • JOINcustomersorders 通过 customer_id 连接起来。
    • WHERE 筛选出过去三个月的订单。
    • GROUP BY 按客户分组。
    • HAVING 确保客户在这三个月内每个月都有复购。

4. 解析查询结果

执行上述 SQL 查询后,查询会返回满足条件的客户信息。如果 monthly_count 为 3,则表示该客户在过去的三个月内都有复购。

-- 执行查询并获取结果
SELECT 
    customer_id, 
    name 
FROM 
    (上述查询的结果); -- 获取最终结果

旅行图

以下是整个流程的旅行图,有助于理解每个步骤之间的关系:

journey
    title 客户复购分析流程
    section 数据准备
      设计数据库表: 5: 客户
      插入测试数据: 4: 客户
    section 数据查询
      编写 SQL 查询: 3: 客户
      解析查询结果: 2: 客户

结尾

通过上述步骤,我们完成了如何通过 MySQL 查询来判断客户在过去三个月内是否有连续复购。希望这个例子能帮助你理解 SQL 查询的基本结构,如 SELECTJOINWHEREGROUP BYHAVING 的使用。随着你技能的提升,你可以考虑进一步优化查询、处理边界情况或设计更复杂的数据库结构。祝你在开发之路上越走越远!