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

如何对比两张数据表获取缺勤学生名单?含PHP代码相关咨询

对比两张表获取缺勤学生名单(附PHP代码优化)

嘿,我来帮你搞定这个问题——从全体学生表和到班名单表里揪出没到班的学生,顺便把你给的PHP代码调整成能用的版本~

一、先搞定核心的SQL查询逻辑

首先得明确两张表的关联字段,比如学生的学号/ID(我先假设全体学生表叫all_students,到班名单表叫present_students,关联字段是student_id,你可以根据实际表名替换)。这里有两种靠谱的写法:

方法1:LEFT JOIN(推荐,适配所有场景)

左连接全体学生表和到班表,筛选出到班表里没有匹配记录的学生,就是缺勤的:

SELECT a.*
FROM all_students a
LEFT JOIN present_students p ON a.student_id = p.student_id
WHERE p.student_id IS NULL
ORDER BY a.student_id;

这个方法的好处是,哪怕到班名单表里有student_id为NULL的记录,也不会影响结果,兼容性拉满。

方法2:NOT IN(适合到班表无NULL值的情况)

如果到班名单里的学生ID都是有效的(没有NULL),也可以用这个更简洁的写法:

SELECT *
FROM all_students
WHERE student_id NOT IN (SELECT student_id FROM present_students)
ORDER BY student_id;

⚠️ 注意:如果present_students里的student_id存在NULL,NOT IN会直接返回空结果,所以优先用LEFT JOIN更稳妥。

二、调整你的PHP代码片段

你原来的代码是从worker表取数据,现在改成查询缺勤学生的逻辑,我帮你优化了一下,加了错误处理和更清晰的逻辑:

<?php
function fetch_absent_students() {
    $output = '';
    // 数据库连接(实际项目别用root!建议创建仅限查询的专用用户)
    $conn = mysqli_connect("localhost", "root", "", "students");
    
    // 先检查连接是否成功,避免出错时毫无提示
    if (!$conn) {
        die("数据库连接失败: " . mysqli_connect_error());
    }

    // 替换成咱们的缺勤查询SQL
    $sql = "SELECT a.*
            FROM all_students a
            LEFT JOIN present_students p ON a.student_id = p.student_id
            WHERE p.student_id IS NULL
            ORDER BY a.student_id";
    
    $result = mysqli_query($conn, $sql);
    
    // 循环生成表格行(根据你的实际表字段调整列)
    while($row = mysqli_fetch_array($result)) {
        $output .= '<tr>
                        <td>'.$row["student_id"].'</td>
                        <td>'.$row["name"].'</td>
                        <td>'.$row["grade_class"].'</td>
                        <!-- 这里可以添加更多你的表字段,比如性别、联系方式等 -->
                    </tr>';
    }
    
    mysqli_close($conn); // 记得关闭连接,养成良好习惯
    return $output;
}
?>

代码里的小细节说明:

  • 函数名改成了fetch_absent_students,一眼就能看出功能;
  • 加了连接失败的判断,避免出错时一脸懵;
  • 假设你的all_students表有student_id、name、grade_class字段,你可以根据自己的表结构修改输出的列;

三、几个要注意的点

  1. 字段匹配要一致:两张表用来关联的字段(比如student_id)类型必须相同,比如都是INT或者VARCHAR,否则会出现匹配不上的情况;
  2. 安全问题:实际项目中绝对不要用root用户连接数据库,创建一个只有查询权限的专用用户更安全;如果需要根据用户输入筛选(比如按班级查缺勤),一定要用预处理语句防止SQL注入;
  3. 表名和字段名替换:记得把代码里的all_students、present_students、student_id这些换成你实际的表名和字段名哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:18:55