You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_lengthrecord_count
155
192
243

对应的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:06:07