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

如何用MySQL和PHP结合多表过滤匹配当前日期范围的数据

解决方案

嘿,我来帮你搞定这个关联多张表过滤数据的需求~ 结合你的输入数组和表结构,我整理了对应的SQL查询语句,以及PHP端的处理逻辑,确保满足所有过滤条件:

核心SQL查询思路

首先,我们需要把输入数组的数据和两张表关联起来,同时满足三个关键条件:

  1. 输入数组的reg_no匹配db_application的regn_no
  2. db_application的exam_code和Institute_code匹配db_app的对应字段(注意db_app的Institute_code是逗号分隔的多值,需要用FIND_IN_SET判断)
  3. 当前日期处于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:39:06