如何用MySQL和PHP结合多表过滤匹配当前日期范围的数据
解决方案
嘿,我来帮你搞定这个关联多张表过滤数据的需求~ 结合你的输入数组和表结构,我整理了对应的SQL查询语句,以及PHP端的处理逻辑,确保满足所有过滤条件:
核心SQL查询思路
首先,我们需要把输入数组的数据和两张表关联起来,同时满足三个关键条件:
- 输入数组的
reg_no匹配db_application的regn_no db_application的exam_code和Institute_code匹配db_app的对应字段(注意db_app的Institute_code是逗号分隔的多值,需要用FIND_IN_SET判断)- 当前日期处于
db_app的start_date和end_date范围内
直接可执行的SQL语句
这里我用临时表模拟输入数组的数据,这样查询可以一次性处理所有输入项,效率更高:
SELECT ia.reg_no, ia.college_roll_no, ia.institute_code, ia.full_name, da.id AS application_id, -- 从db_application获取的额外字段 dap.start_date, dap.end_date, dap.exam_code FROM ( -- 模拟输入数组的临时表 SELECT 'AD17323' AS reg_no, 'AD1700323' AS college_roll_no, 'AD' AS institute_code, 'RAJU MALLICK' AS full_name UNION ALL SELECT 'AD17298' AS reg_no, 'AD1700298' AS college_roll_no, 'AD' AS institute_code, 'BISWARAJ NAYAK' AS full_name ) AS ia JOIN db_application da ON ia.reg_no = da.regn_no JOIN db_app dap ON da.exam_code = dap.exam_code AND FIND_IN_SET(da.Institute_code, dap.Institute_code) > 0 -- 匹配逗号分隔的机构编码 AND CURDATE() BETWEEN dap.start_date AND dap.end_date; -- 当前日期在日期范围内
PHP端结合输入数组的实现
如果输入数组是动态的(不是固定的两个元素),可以用PHP动态构造查询语句,同时用参数绑定防止SQL注入:
// 你的输入数组 $inputArr = [ ["reg_no"=>"AD17323","college_roll_no"=>"AD1700323","institute_code"=>"AD","full_name"=>"RAJU MALLICK"], ["reg_no"=>"AD17298","college_roll_no"=>"AD1700298","institute_code"=>"AD","full_name"=>"BISWARAJ NAYAK"] ]; // 假设已经通过PDO建立了数据库连接$pdo try { // 动态构造UNION ALL的临时表部分 $unionParts = []; $params = []; foreach ($inputArr as $item) { $unionParts[] = "SELECT ?, ?, ?, ?"; $params[] = $item['reg_no']; $params[] = $item['college_roll_no']; $params[] = $item['institute_code']; $params[] = $item['full_name']; } $unionSql = implode(" UNION ALL ", $unionParts); // 完整SQL语句 $sql = " SELECT ia.reg_no, ia.college_roll_no, ia.institute_code, ia.full_name, da.id AS application_id, dap.start_date, dap.end_date, dap.exam_code FROM ($unionSql) AS ia JOIN db_application da ON ia.reg_no = da.regn_no JOIN db_app dap ON da.exam_code = dap.exam_code AND FIND_IN_SET(da.Institute_code, dap.Institute_code) > 0 AND CURDATE() BETWEEN dap.start_date AND dap.end_date; "; // 执行查询 $stmt = $pdo->prepare($sql); $stmt->execute($params); $filteredData = $stmt->fetchAll(PDO::FETCH_ASSOC); // 输出符合条件的结果 echo json_encode($filteredData); } catch(PDOException $e) { die("数据库查询失败: " . $e->getMessage()); }
关键注意点
- 针对
db_app表中逗号分隔的Institute_code,用FIND_IN_SET函数来判断匹配,这是处理这种多值字段的常用方法(如果后续有优化空间,建议把这个字段改成关联表,会更规范) - 用
CURDATE()获取当前日期,如果你的业务需要包含时间判断,可以换成NOW() - 用PDO参数绑定避免SQL注入,这是生产环境必须注意的安全问题
内容的提问来源于stack exchange,提问作者user5443928
相关产品推荐
相关产品推荐

