You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQLi中筛选未按时缴纳分期的客户以生成报告?

嘿,这个需求在催收系统里太常见了,我帮你捋清楚实现步骤,分SQL查询和PHP代码两部分来搞:

核心思路

我们要找的是到指定到期日(比如当月10号)为止,还没有在table2中留下对应当月付款记录的客户——因为你说付款后才会插入table2,所以没记录就代表没付款。

先假设你的表结构(如果和实际有出入,你可以调整字段名):

  • table1(客户表):customer_id(主键)、customer_name、phone、email等基础信息
  • table2(分期记录):payment_id(主键)、customer_id(关联table1的外键)、payment_date(DATE类型,付款日期)、installment_amount等付款细节
SQL查询实现

1. 筛选当月10号前未付款的客户

用左连接把已付款的客户匹配出来,剩下的就是未付款的:

SELECT t1.*
FROM table1 t1
LEFT JOIN table2 t2 
  ON t1.customer_id = t2.customer_id
  AND YEAR(t2.payment_date) = YEAR(CURDATE())
  AND MONTH(t2.payment_date) = MONTH(CURDATE())
  AND DAY(t2.payment_date) <= 10
WHERE t2.payment_id IS NULL;

解释:左连接会保留所有table1的客户,把当月10号前有付款记录的客户和table2关联起来;WHERE t2.payment_id IS NULL就筛选出那些没有匹配到付款记录的客户——也就是未付款的。

2. 支持指定到期日/月份

如果要查特定月份(比如2024年5月15号)的未付款客户,直接替换参数就行:

SELECT t1.*
FROM table1 t1
LEFT JOIN table2 t2 
  ON t1.customer_id = t2.customer_id
  AND YEAR(t2.payment_date) = 2024
  AND MONTH(t2.payment_date) = 5
  AND DAY(t2.payment_date) <= 15
WHERE t2.payment_id IS NULL;
PHP代码实现(MySQLi)

下面是完整的MySQLi示例,包含数据库连接、预处理查询(防SQL注入)、生成催收报告,还可以扩展发送提醒:

// 数据库配置
$servername = "localhost";
$username = "你的数据库用户名";
$password = "你的数据库密码";
$dbname = "你的数据库名";

// 建立连接
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 可配置的到期参数:比如指定当月10号,或者让运营人员输入
$targetDay = 10;
$currentYear = date('Y');
$currentMonth = date('m');

// 用预处理语句防止SQL注入!这很重要
$sql = "SELECT t1.customer_id, t1.customer_name, t1.phone, t1.email
        FROM table1 t1
        LEFT JOIN table2 t2 
          ON t1.customer_id = t2.customer_id
          AND YEAR(t2.payment_date) = ?
          AND MONTH(t2.payment_date) = ?
          AND DAY(t2.payment_date) <= ?
        WHERE t2.payment_id IS NULL";

$stmt = $conn->prepare($sql);
$stmt->bind_param("iii", $currentYear, $currentMonth, $targetDay); // 绑定参数,iii代表三个整数
$stmt->execute();
$result = $stmt->get_result();

// 生成催收报告(这里用HTML表格,也可以导出成CSV)
if ($result->num_rows > 0) {
    echo "<h2>{$currentYear}年{$currentMonth}月到期未付款客户报告</h2>";
    echo "<table border='1' cellpadding='8' cellspacing='0'>
            <tr>
              <th>客户ID</th>
              <th>姓名</th>
              <th>联系电话</th>
              <th>邮箱</th>
            </tr>";
    
    while($row = $result->fetch_assoc()) {
        echo "<tr>
                <td>{$row['customer_id']}</td>
                <td>{$row['customer_name']}</td>
                <td>{$row['phone']}</td>
                <td>{$row['email']}</td>
              </tr>";
        
        // 这里可以加发送提醒的逻辑,比如调用邮件函数给客户发提醒
        // sendPaymentReminder($row['email'], $row['customer_name'], $currentYear, $currentMonth, $targetDay);
    }
    echo "</table>";
} else {
    echo "<p>太好了!当月所有客户都已按时付款🎉</p>";
}

// 清理资源
$stmt->close();
$conn->close();
额外注意事项
  • SQL注入防护:一定要用预处理语句,别直接把变量拼进SQL里,上面的代码已经做了,别偷懒!
  • 到期日灵活性:如果不同客户有不同的到期日(比如有的是5号,有的是15号),建议新增一个表存储每个客户的专属到期日,然后SQL关联这个表来动态获取到期日。
  • 付款记录去重:如果同一个客户当月可能有多条付款记录,左连接不会影响结果,因为只要有一条符合条件的记录,就会被排除出未付款列表。
  • 提醒功能扩展:如果要自动发邮件,可以用PHP的mail()函数,或者更稳定的PHPMailer库;发短信的话可以对接第三方短信API。

内容的提问来源于stack exchange,提问作者Tasaddaq Rana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:29:40