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

如何检测有连续天数考试的学生?SQL+PHP代码报错求助

解决方案:用SQL自连接高效检测连续考试的学生

我来帮你搞定这个问题,你之前的思路绕远了——完全不需要在PHP里循环处理日期数组,直接用SQL自连接就能精准、高效地满足需求,还能避免语法错误。

核心思路梳理

我们的目标是找出:同一个学生有两场考试日期相差1天,且排除周四→周日这种跨周末的特殊情况。利用SQL的自连接(把同一张表当成两张表关联)就能直接实现这个逻辑,不用额外的PHP数组处理。

正确的SQL查询语句

这里给你写出满足需求的SQL,逻辑清晰且高效:

SELECT DISTINCT e1.Student_ID,
                e1.Subject_name AS first_subject,
                e1.exam_dates AS first_exam_date,
                e1.exam_days AS first_exam_day,
                e2.Subject_name AS second_subject,
                e2.exam_dates AS second_exam_date,
                e2.exam_days AS second_exam_day
FROM Examdata e1
JOIN Examdata e2 ON e1.Student_ID = e2.Student_ID
WHERE 
  -- 两场考试日期相差1天
  DATEDIFF(e2.exam_dates, e1.exam_dates) = 1
  -- 排除周四之后接周日的情况(跨周末不算连续)
  AND NOT (e1.exam_days = 'Thursday' AND e2.exam_days = 'Sunday')
  -- 避免重复结果(比如学生A的2号和3号考试,只保留2→3的记录,不出现3→2)
  AND e1.exam_dates < e2.exam_dates
ORDER BY e1.Student_ID, e1.exam_dates;

如果只需要获取有连续考试的学生ID,把SELECT后的字段改成DISTINCT e1.Student_ID即可。

修正后的PHP代码

替换你原来的代码,去掉复杂的数组逻辑,直接执行上面的SQL:

<?php
$con = mysqli_connect("localhost", "root", "", "Exams");
// 先检查数据库连接是否成功
if (!$con) {
    die("数据库连接失败: " . mysqli_connect_error());
}

// 执行准备好的SQL查询
$sql = "SELECT DISTINCT e1.Student_ID,
                e1.Subject_name AS first_subject,
                e1.exam_dates AS first_exam_date,
                e1.exam_days AS first_exam_day,
                e2.Subject_name AS second_subject,
                e2.exam_dates AS second_exam_date,
                e2.exam_days AS second_exam_day
        FROM Examdata e1
        JOIN Examdata e2 ON e1.Student_ID = e2.Student_ID
        WHERE 
          DATEDIFF(e2.exam_dates, e1.exam_dates) = 1
          AND NOT (e1.exam_days = 'Thursday' AND e2.exam_days = 'Sunday')
          AND e1.exam_dates < e2.exam_dates
        ORDER BY e1.Student_ID, e1.exam_dates;";

$query = mysqli_query($con, $sql) or die("查询错误: " . mysqli_error($con));

// 输出格式化的结果表格
echo "<table border='1'>
        <tr>
          <th>学生ID</th>
          <th>第一门科目</th>
          <th>第一门考试日期</th>
          <th>第一门考试星期</th>
          <th>第二门科目</th>
          <th>第二门考试日期</th>
          <th>第二门考试星期</th>
        </tr>";

while ($result = mysqli_fetch_assoc($query)) {
    echo "<tr>
            <td>" . $result['Student_ID'] . "</td>
            <td>" . $result['first_subject'] . "</td>
            <td>" . $result['first_exam_date'] . "</td>
            <td>" . $result['first_exam_day'] . "</td>
            <td>" . $result['second_subject'] . "</td>
            <td>" . $result['second_exam_date'] . "</td>
            <td>" . $result['second_exam_day'] . "</td>
          </tr>";
}
echo "</table>";

// 关闭数据库连接
mysqli_close($con);
?>

你原来代码出错的原因

  • SQL中判断相等用=,不是PHP里的==;
  • 子查询的语法完全错误,正确的关联查询应该用JOIN,而不是你写的嵌套格式;
  • 直接把JSON格式的数组字符串塞到SQL里,会导致SQL无法识别日期值,引发语法混乱。

这样处理不仅代码更简洁,查询效率也更高——数据库天生擅长处理这类关联逻辑~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:49:39