如何将数据库行值在HTML表格不同列展示?解决重复行问题
问题分析与修复方案
原代码核心问题
- 循环内重复输出两行
<tr>,直接造成表格行冗余重复 - 错误用
$row['mark']++和$row['out_of']++实现求和,这是自增操作而非累加计算 - 硬编码重复输出同一
mark值三次,未匹配实际数据展示逻辑 - SQL未按学生分组,若学生有多条成绩记录会导致数据重复输出
修复后的完整代码
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "jion"; // 创建数据库连接 $conn = mysqli_connect($servername, $username, $password, $dbname); // 检查连接状态 if (!$conn) { die("连接失败: " . mysqli_connect_error()); } ?> <!DOCTYPE html> <head> <title>学生数学成绩表</title> </head> <body> <table border="1"> <tr> <th rowspan="2">序号</th> <th rowspan="2">学号</th> <th rowspan="2">全名</th> <th colspan="3">数学科目成绩</th> <th>总分</th> </tr> <tr> <!-- 可根据实际业务调整子列名称,比如"单元测1""单元测2""单元测3" --> <th>测试1</th> <th>测试2</th> <th>测试3</th> </tr> <?php // 按学生分组查询,聚合成绩数据 $sql = "SELECT s.index_number as id, s.fname as first_name, s.lname as last_name, GROUP_CONCAT(m.mark ORDER BY m.id SEPARATOR ',') as marks, SUM(m.mark) as total_mark FROM student_name s INNER JOIN mark m ON m.st_id = s.index_number INNER JOIN out_of o ON o.subject_id = m.subject_id WHERE m.subject_id=1 GROUP BY s.index_number, s.fname, s.lname"; $result = mysqli_query($conn, $sql); $count = 0; if(mysqli_num_rows($result) > 0){ while($row = mysqli_fetch_assoc($result)){ $count++; // 拆分成绩数组,不足3项补空保证排版整齐 $marks = explode(',', $row['marks']); while(count($marks) < 3) { $marks[] = ''; } ?> <tr> <td><?php echo $count; ?></td> <td><?php echo $row['id']; ?></td> <td><?php echo $row['first_name'] . ' ' . $row['last_name']; ?></td> <td><?php echo $marks[0]; ?></td> <td><?php echo $marks[1]; ?></td> <td><?php echo $marks[2]; ?></td> <td><?php echo $row['total_mark']; ?></td> </tr> <?php } } // 关闭数据库连接 mysqli_close($conn); ?> </table> </body>
关键调整说明
- SQL优化:用
GROUP BY按学生分组,GROUP_CONCAT收集该学生所有数学成绩,SUM直接计算总分,从根源避免数据重复 - 表格结构修正:补充表头第二行的子列,确保数据行列数与表头对应,删除原代码中多余的重复行
- 成绩处理:将聚合后的成绩拆分为数组,不足3项时补空,保证表格排版整齐
- 求和逻辑修正:直接使用SQL聚合的
SUM结果,替代原代码中错误的自增操作
内容的提问来源于stack exchange,提问作者Guyo Turo
相关产品推荐
相关产品推荐

