PHP结合MySQL统计unit表各列'N'/'I'/'ETP'值出现次数的方法
单条MySQL查询配合PHP实现多列枚举值统计方案
方案1:使用MySQL聚合函数(性能最优)
直接通过聚合查询一次性算出所有列的三个枚举值出现次数,仅返回1行统计结果,无需遍历全表数据,适合数据量较大的场景。
编写单条统计SQL
SELECT -- gcc_1_1 列统计 COUNT(CASE WHEN gcc_1_1 = 'N' THEN 1 END) AS gcc_1_1_n, COUNT(CASE WHEN gcc_1_1 = 'I' THEN 1 END) AS gcc_1_1_i, COUNT(CASE WHEN gcc_1_1 = 'ETP' THEN 1 END) AS gcc_1_1_etp, -- gcc_1_2 列统计 COUNT(CASE WHEN gcc_1_2 = 'N' THEN 1 END) AS gcc_1_2_n, COUNT(CASE WHEN gcc_1_2 = 'I' THEN 1 END) AS gcc_1_2_i, COUNT(CASE WHEN gcc_1_2 = 'ETP' THEN 1 END) AS gcc_1_2_etp, -- gcc_1_3 列统计,剩余15个列按照相同规则补全即可 COUNT(CASE WHEN gcc_1_3 = 'N' THEN 1 END) AS gcc_1_3_n, COUNT(CASE WHEN gcc_1_3 = 'I' THEN 1 END) AS gcc_1_3_i, COUNT(CASE WHEN gcc_1_3 = 'ETP' THEN 1 END) AS gcc_1_3_etp FROM unit
PHP处理结果生成对应变量
// 填入上面补全所有18列的完整SQL $query = "上述完整统计SQL语句"; $result = $connection->query($query); $statData = mysqli_fetch_assoc($result); // 批量生成要求格式的变量,生成后可直接调用 $gcc_1_1_n、$gcc_1_1_i 等变量 extract($statData);
方案2:兼容原有全表遍历逻辑
如果需要保留原有SELECT *的全表遍历逻辑(比如同时需要处理行级其他业务),可使用以下实现:
// 补全所有18个列名到数组中 $allColumns = ['gcc_1_1', 'gcc_1_2', 'gcc_1_3']; // 初始化所有统计变量为0 foreach ($allColumns as $colName) { ${$colName . '_n'} = 0; ${$colName . '_i'} = 0; ${$colName . '_etp'} = 0; } $query = "SELECT * FROM unit"; $result = $connection->query( $query ); while ($row = mysqli_fetch_array($result)) { foreach ($allColumns as $colName) { $currentVal = strtolower($row[$colName]); ${$colName . '_' . $currentVal}++; } }
- 方案1的性能远高于方案2,无特殊需求优先选择方案1
- 两种方案最终生成的变量名完全匹配需求的命名规则
内容的提问来源于stack exchange,提问作者IlludiumPu36
相关产品推荐
相关产品推荐

