PHP中SQL COUNT聚合查询结果无法在HTML表格正常显示的问题
问题根因
两个输出异常分别对应两个独立问题:
- COUNT统计列显示为空:SQL中的
COUNT(tipe)没有设置字段别名,mysqli_fetch_assoc()返回的关联数组键名不会自动匹配tipe,直接读取$row['tipe']拿不到聚合计算结果。 - 仅显示A、B用户,C、D用户缺失:WHERE子句直接加
tipe=2过滤条件时,分组前不符合条件的记录会被全部剔除,C、D用户没有tipe=2的记录,会被直接排除在查询结果外,自然无法显示统计值0。另外原SQL中order by id asc存在逻辑问题,分组后的结果集不存在独立id字段,会触发SQL执行错误。
修正方案
首先调整SQL逻辑:
- 不在WHERE中过滤tipe=2,改为在COUNT函数内做条件判断,保证所有bln=1的用户都会被返回,无匹配tipe=2记录的用户统计值自动为0
- 给COUNT计算结果设置明确别名,方便PHP端取值
- 调整排序规则,按user字段排序
修正后的SQL语句:
SELECT user, COUNT(CASE WHEN tipe = 2 THEN 1 END) AS tipe_total FROM keg WHERE bln = 1 GROUP BY user ORDER BY user ASC
逻辑说明:
COUNT(CASE WHEN tipe=2 THEN 1 END)只会对tipe=2的记录计数,不符合条件的记录返回null,COUNT会自动忽略null值,无匹配记录的用户最终统计结果就是0。
之后调整PHP代码中统计列的取值,对应读取设置的别名字段即可,完整修正后的PHP代码:
$sql = mysqli_query($link, "SELECT user, COUNT(CASE WHEN tipe = 2 THEN 1 END) AS tipe_total FROM keg WHERE bln = 1 GROUP BY user ORDER BY user ASC"); if(mysqli_num_rows($sql) == 0){ echo '<tr><td colspan="8">Tidak ada data.</td></tr>'; }else{ $no = 1; while($row = mysqli_fetch_assoc($sql)){ echo ' <tr> <td>'.$no.'</td> <td>'.$row['user'].'</td> <td>'.$row['tipe_total'].'</td> </tr> '; $no++; } }
内容的提问来源于stack exchange,提问作者Herlambang Permadi
相关产品推荐
相关产品推荐

