如何在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
相关产品推荐
相关产品推荐

