MySQL多表查询返回多余重复行 获取匹配ID正确结果的修复方案
问题根因
你写的SQL属于无关联条件的隐式交叉连接,会触发笛卡尔积计算:reclamation表中满足status_recla = 'En attendant' AND id_ens IS NULL的每一行,都会和etudiant表的每一行强行拼接返回。你库中符合条件的申诉记录共1条,学生表共3条记录,自然会返回3条拼接后的冗余结果,和你遇到的现象完全一致。
修复方案
核心是给两张表加关联匹配条件,同时顺手修复代码里的小问题:
- 弃用逗号分隔表的隐式连接写法,改用
INNER JOIN显式关联,通过两表共有的学生ID字段做匹配(常规设计下申诉表reclamation会存id_etud字段关联学生表主键) - 不要用
SELECT *查全字段,只取实际用到的字段,避免两表同名字段(比如id字段)互相覆盖导致取值错误 - 删掉输出日期单元格时多写的一个
</td>闭合标签,避免HTML结构错乱
修正后完整代码
$sql = "SELECT r.id_recla, r.date_recla, r.Titre_recla, r.desc_recla, e.nom_etud, e.prenom_etud FROM reclamation r INNER JOIN etudiant e ON r.id_etud = e.id_etud WHERE r.status_recla = 'En attendant' AND r.id_ens IS NULL"; $query = mysqli_query($conn,$sql); if($query){ if (mysqli_num_rows($query) != 0 ){ while($row = mysqli_fetch_assoc($query)){ echo "<tr>"; echo "<td style='width: 150px;'>".$row['nom_etud']." ".$row['prenom_etud']."</td>"; // 修复了此处多余的</td>闭合标签 echo "<td style='width: 150px;'>".$row['date_recla']."</td>"; echo "<td style='width: 150px;'>".$row['Titre_recla']."</td>"; echo "<td style='width: 150px;'>".$row['desc_recla']."</td>"; echo "<td class='text-center align-middle' style='max-height: 60px;height: 60px;'><a class='btn btn-primary' type='button' style='background-color: limegreen;margin-right: 20px;' href='edit.php?accepteRecla=".$row['id_recla']."&idchef=".$id."'>Accepter</a><a class='btn btn-primary' type='button' style='background-color: var(--bs-red);' href='edit.php?refuseRecla=".$row['id_recla']."&idchef=".$id."'>Refuser</a></td>"; echo "</tr>"; } } } else{ echo mysqli_error($conn); } ?>
注意:如果你实际表结构里的关联字段名不是
id_etud,只需要把ON r.id_etud = e.id_etud中的字段名替换为你实际使用的外键字段即可。
参考截图
- 数据库表结构参考:

- 错误查询返回结果参考:

内容的提问来源于stack exchange,提问作者Mohamed Kanich
相关产品推荐
相关产品推荐

