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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:39:25