我正在使用Laravel 5.2并尝试构建一个查询,以创建过去30天内推荐其他用户的前5位用户的表格。
目前,用户表中有一列'推介'其中包含引用它们的用户的ID。我将在下面提供我当前的查询,以便您了解相关信息。但基本上我想返回一个由5个用户组成的列表,这些用户推荐次数最多,排序最多,所以我可以创建我的排行榜表。
这是我到目前为止所得到的:
$top5_referrers = User::join('users_roles_link', 'users_roles_link.user_id', '=', 'user.id')
->where('users_roles_link.role_id',12)
->whereDate('user.created_at', '>=', Carbon::today()->subDay(30)->toDateString())
->select(
DB::raw('
user.id, user.username
(SELECT COUNT(u.id) FROM user u WHERE u.referral = user.id AND u.referral IS NOT NULL AND u.created_at >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)) AS total_signups
'))
->groupBy('user.id')
->orderBy('total_signups', 'desc')
->take(5)
->get();
现在我知道我已经错了,因为已经有一个角色为12的用户所在的位置(对于那些想知道的用户而言,这是我唯一对此列表感兴趣的人)引用!),我将结果限制为这些mods,当我真的需要带回一个只有mod的列表,但将该列表基于用户。
此系统有14,000多个用户,因此我需要尽可能在数据库服务器上执行此操作。有人可以提供任何建议吗?我真的很感激。感谢。
答案 0 :(得分:0)
好的,所以今后任何人都会发现这一点。
我在考虑这个问题。我只需要抓住所有第一个角色为'12'的用户,然后删除whereDate,因为我需要所有具有角色12的用户,而不仅仅是新的启动者。
然后在DB :: raw中,我能够选择具有与当前引用的用户匹配的引用的用户。
傻傻的我。