如何使用原生查询统计partner表不同type类型的记录数量
不同类型合作伙伴计数实现逻辑
你可以通过原生SQL分组聚合一次性完成统计,不需要多次循环查询,性能更优,实现代码如下:
// 一次原生查询完成所有类型分组计数 $typeStats = \DB::select(" SELECT type, COUNT(id) AS total FROM partner WHERE type IN ('yearly', 'monthly', 'weekly') GROUP BY type "); // 按预设的类型顺序整理返回结果 $typeList = ['Yearly', 'Monthly', 'Weekly']; $partner = []; // 先组装查询结果为键值对方便映射 $statMap = []; foreach ($typeStats as $stat) { $statMap[strtolower($stat->type)] = $stat->total; } // 按顺序填充计数,对应类型无数据时补0 foreach ($typeList as $typeItem) { $partner[] = $statMap[strtolower($typeItem)] ?? 0; }
如果你需要和现有按年份统计的逻辑保持一致,采用循环单查的写法,对应原生查询实现如下:
$year = ['2015','2016','2017','2018','2019','2020','2021','2022']; $user = []; $type = ['Yearly','Monthly','Weekly']; $partner = []; // 原有按年份统计用户的逻辑 foreach ($year as $key => $value) { $user[] = User::where(\DB::raw("DATE_FORMAT(created_at, '%Y')"),$value)->count(); } // 新增按合作伙伴类型统计的原生查询逻辑 foreach ($type as $value) { // 注意表内type存储值为小写,查询时统一转小写匹配避免大小写误差 $count = \DB::selectOne( "SELECT COUNT(id) AS total FROM partner WHERE LOWER(type) = ?", [strtolower($value)] )->total; $partner[] = $count; }
提示:优先使用单条分组聚合的写法,仅需和数据库交互1次即可拿到所有结果,相比循环3次查询的写法性能提升明显。
内容的提问来源于stack exchange,提问作者Muhammad Zamir
相关产品推荐
相关产品推荐

