PHP实现按mac_addr字符数分组统计(单SQL查询替代多查询)
用单个SQL查询统计不同长度mac_addr的记录数
嘿,我明白你现在的需求——原来要写好几个独立查询来统计不同长度的mac_addr记录数,确实有点麻烦!其实用单个SQL查询就能轻松搞定,核心就是用GROUP BY按字符长度分组统计。
基础解决方案:统计所有存在的长度
直接通过LENGTH(mac_addr)作为分组字段,搭配COUNT(*)统计每组的记录数,一次查询就能拿到所有结果:
SELECT LENGTH(mac_addr) AS char_length, COUNT(*) AS record_count FROM orders GROUP BY char_length;
这个语句会返回所有mac_addr长度对应的记录数,比如:
| char_length | record_count |
|---|---|
| 15 | 5 |
| 19 | 2 |
| 24 | 3 |
对应的PHP代码修改
你不用再写多个mysqli_query了,只需要一次查询,然后遍历结果集把数据存到数组里,后续使用更灵活:
// 执行单个查询 $query = mysqli_query($conn, "SELECT LENGTH(mac_addr) AS char_length, COUNT(*) AS record_count FROM orders GROUP BY char_length"); // 把结果存入数组,键是长度,值是记录数 $lengthCounts = []; while ($row = mysqli_fetch_assoc($query)) { $lengthCounts[$row['char_length']] = $row['record_count']; } // 示例使用:获取15字符的记录数 $kar1 = isset($lengthCounts[15]) ? $lengthCounts[15] : 0; // 获取19字符的记录数 $kar2 = isset($lengthCounts[19]) ? $lengthCounts[19] : 0;
进阶解决方案:只统计指定长度(含无记录的情况)
如果你只关心特定的几个长度(比如你提到的15、19、24),并且希望即使某个长度没有记录也显示0,可以用WITH子句生成目标长度列表,再通过LEFT JOIN关联统计结果:
WITH target_lengths AS ( SELECT 15 AS len UNION ALL SELECT 19 UNION ALL SELECT 24 ) SELECT tl.len AS char_length, COALESCE(o.record_count, 0) AS record_count FROM target_lengths tl LEFT JOIN ( SELECT LENGTH(mac_addr) AS len, COUNT(*) AS record_count FROM orders GROUP BY len ) o ON tl.len = o.len;
这个查询会强制返回你指定的所有长度,没有记录的长度对应的record_count会显示0,结果更符合你的预期。
内容的提问来源于stack exchange,提问作者illogic
相关产品推荐
相关产品推荐

