PHP统计MySQL查询结果中ID出现次数并合并重复项(禁用SQL聚合)
高效统计重复ID生成目标数组(PHP端实现)
我明白你的需求了——在高负载场景下,不能通过SQL的DISTINCT、GROUP BY或临时表来处理,只能在PHP端统计MySQL返回的重复ID次数,生成键为ID、值为计数字符串的数组。你之前尝试的array_count_values($row)无效,是因为$row是单条查询结果的数组,而非所有ID的集合,下面给你两种适配高负载场景的解决方案:
方案1:边遍历边统计(低内存占用,优先推荐)
这种方式不需要额外存储所有ID的数组,直接在遍历查询结果时完成计数,内存占用更低,非常适合高负载下的大结果集:
$counts = []; // 假设你用PDO获取结果,mysqli的写法类似 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $currentId = $row['ID']; // 存在则计数+1,不存在则初始化为1 $counts[$currentId] = isset($counts[$currentId]) ? $counts[$currentId] + 1 : 1; } // 将计数转换为字符串格式(匹配你要的"1"、"3"形式) foreach ($counts as $id => $num) { $counts[$id] = (string)$num; }
执行后$counts就是你需要的数组:['997fd' => "1", '782gt' => "3"]
方案2:先收集所有ID再统计(简单直观)
如果结果集规模不大,这种写法更简洁:
$allIds = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $allIds[] = $row['ID']; } // 用array_count_values直接统计重复次数 $counts = array_count_values($allIds); // 转换为字符串值 foreach ($counts as $id => $num) { $counts[$id] = (string)$num; }
补充说明
你之前的尝试失败是因为array_count_values($row)处理的是单条结果的数组(比如['ID' => '782gt']),这个函数会统计该数组内键值的出现次数,而非全局所有ID的重复次数,所以无法得到预期结果。
内容的提问来源于stack exchange,提问作者SeanAA
相关产品推荐
相关产品推荐

