Laravel中如何用1-2个查询获取MySQL单列重复值统计(避免N+1问题)
Laravel 单列重复值统计(解决N+1查询问题)
方法一:使用Eloquent查询
直接通过Eloquent聚合查询+分组实现,一次查询即可完成统计,彻底避免N+1问题:
// 替换YourModel为你的实际模型类,target_column为要统计的列名 $duplicateCounts = YourModel::query() ->select('target_column', \DB::raw('COUNT(*) as repeat_count')) ->groupBy('target_column') ->pluck('repeat_count', 'target_column'); // 如需转为数组格式,调用toArray() $duplicateCountsArray = $duplicateCounts->toArray();
pluck('repeat_count', 'target_column')会直接将结果转换为目标列唯一值为键、重复次数为值的集合,最终输出类似:['值1' => 3, '值2' => 9]。
方法二:使用原生SQL查询
如果偏好原生SQL写法,同样只需一次查询:
// 替换your_table为实际表名,target_column为要统计的列名 $rawResults = \DB::select('SELECT target_column, COUNT(*) as repeat_count FROM your_table GROUP BY target_column'); // 转换为键值对格式 $duplicateCounts = collect($rawResults)->pluck('repeat_count', 'target_column')->toArray();
核心原理
以上两种方案都是利用MySQL的GROUP BY聚合能力,在数据库层面一次性完成所有重复值的统计,无需先查询所有唯一值再循环统计次数,从根源上杜绝了N+1查询的产生。
内容的提问来源于stack exchange,提问作者Imran Yahya
相关产品推荐
相关产品推荐

