如何检测有连续天数考试的学生?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
相关产品推荐
相关产品推荐

