这是一个用户推荐统计以及排序的功能
想实现的效果是查询出用户的姓名
然后统计 他的推荐总人数 以及被推荐人 每个 状态的 人数
使用 orderBy 排序会出现 sql 执行时间数十秒的情况
不使用 orderBy 排序无法实现到最多人数的在最上面
请各位大神指教,该如何进行优化
这是一个用户推荐统计以及排序的功能
想实现的效果是查询出用户的姓名
然后统计 他的推荐总人数 以及被推荐人 每个 状态的 人数
使用 orderBy 排序会出现 sql 执行时间数十秒的情况
不使用 orderBy 排序无法实现到最多人数的在最上面
请各位大神指教,该如何进行优化
对于这个情况,你可以考虑使用 Eloquent 的 withCount 方法来进行用户的推荐总人数和被推荐人状态下的人数的统计。例如:
$users = User::withCount([
'recommendations',
'recommendations as accepted_recommendations_count' => function ($query) {
$query->where('status', 'accepted');
},
'recommendations as pending_recommendations_count' => function ($query) {
$query->where('status', 'pending');
},
])
->get();
然后,你可以使用 Laravel 的集合方法来对结果进行排序,例如:
$users = $users->sortByDesc(function ($user) {
return $user->accepted_recommendations_count;
});
如果你的数据量非常大,可以考虑对 recommend_status 字段创建索引以加快查询速度。同时,你也可以使用 Laravel 自带的缓存功能将查询结果缓存起来,避免频繁查询数据库。