如何按分类与级别统计问题数量?PHP代码输出表格重复行求助
解决表格重复行及数据展示错误问题
你的问题根源在于SQL分组逻辑和表格输出不匹配:当前SQL按level和cat(注意你表字段是cat_name,这里是笔误)分组,会把同一个分类下的不同级别拆成独立行返回,导致表格里同一个分类出现多次(每个级别一行),也就是你看到的重复行。同时你的输出逻辑也没对应表格的列结构,只输出了部分数据。
修正方案
1. 调整SQL查询语句
使用条件聚合,按分类分组,一次性统计每个分类下各等级的问题数及总数:
SELECT cat_name, COUNT(*) AS total_count, SUM(CASE WHEN level = 'easy' THEN 1 ELSE 0 END) AS easy_count, SUM(CASE WHEN level = 'middle' THEN 1 ELSE 0 END) AS middle_count, SUM(CASE WHEN level = 'difficult' THEN 1 ELSE 0 END) AS difficult_count FROM questions GROUP BY cat_name
这个查询会为每个分类返回一行数据,包含该分类的总题数、各等级题数。
2. 修正PHP输出逻辑
对应表格的列结构,输出每个分类的完整数据:
<table class="table table-striped table-hover"> <thead> <tr class="table-active table-dark"> <th scope="row">Cat Name</th> <th>Total questions</th> <th>easy</th> <th>middle</th> <th>difficult</th> </tr> </thead> <tbody> <?php if (!$con) { die('Could not connect: ' . mysqli_error($con)); } // 执行修正后的查询 $result = $con->query('SELECT cat_name, COUNT(*) AS total_count, SUM(CASE WHEN level = "easy" THEN 1 ELSE 0 END) AS easy_count, SUM(CASE WHEN level = "middle" THEN 1 ELSE 0 END) AS middle_count, SUM(CASE WHEN level = "difficult" THEN 1 ELSE 0 END) AS difficult_count FROM questions GROUP BY cat_name'); // 遍历结果输出每行 while ($row = $result->fetch_assoc()) { echo "<tr>"; echo "<td>" . htmlspecialchars($row['cat_name']) . "</td>"; echo "<td>" . htmlspecialchars($row['total_count']) . "</td>"; echo "<td>" . htmlspecialchars($row['easy_count']) . "</td>"; echo "<td>" . htmlspecialchars($row['middle_count']) . "</td>"; echo "<td>" . htmlspecialchars($row['difficult_count']) . "</td>"; echo "</tr>"; } ?> </tbody> </table>
额外优化点
- 加入
htmlspecialchars()防止XSS攻击,同时避免特殊字符破坏表格结构。 - 修复了原代码中
id=""class的语法错误,去掉了多余的空id属性。 - 将
foreach改为while + fetch_assoc(),这是mysqli遍历结果集更标准的写法。
内容的提问来源于stack exchange,提问作者rcweb
相关产品推荐
相关产品推荐

