【发布时间】:2018-12-10 20:25:56
【问题描述】:
晚安社区,
我需要帮助才能从 mysql 表中检索记录,如下所示。请注意我的目标结果:
以下是我目前的方法,它在少量行上效果很好,但在数千甚至数百行上运行速度非常慢。
public function usersTopRecruits(){
$tempUID = array();
$mainAssocArr = array();
for ($i=0; $i < User::count(); $i++) {
if($i == 0){
$offset = 0;
}
else{
$offset = $this->take * $i;
}
$users = User::take($this->take)->offset($offset)->get();
foreach ($users as $value) {
$refCnts = User::where('referral', $value->aff_id)->count();
if($refCnts > 0){
$tempUID['userAffID'] = $value->aff_id;
$tempUID['userrecruits'] = $refCnts;
$mainAssocArr[] = $tempUID;
}
}
}//End of For loop
//Here, i tried to sort by highest recruits
foreach ($mainAssocArr as $key => $row) {
$desc[$key] = $row['userrecruits'];
$asc[$key] = $row['userAffID'];
}
array_multisort($desc, SORT_DESC, $asc, SORT_ASC, $mainAssocArr);
return $mainAssocArr;
}
当月:
public function userTopRecruitsCurrMonth(){
$tempUID = array();
$mainAssocArr = array();
for ($i=0; $i < User::count(); $i++) {
if($i == 0){
$offset = 0;
}
else{
$offset = $this->take * $i;
}
$users = User::take($this->take)->offset($offset)->get();
foreach ($users as $value) {
$refCnts = User::where('referral', $value->aff_id)->where('signup_date', '>=', 'startDateOfCurrentMonth')->count();
if($refCnts > 0){
$tempUID['userAffID'] = $value->aff_id;
$tempUID['userRecruits'] = $refCnts;
$mainAssocArr[] = $tempUID;
}
}
}//End of For loop
foreach ($mainAssocArr as $key => $row) {
$volume[$key] = $row['userRecruits'];
$edition[$key] = $row['userAffID'];
}
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $mainAssocArr);
return $mainAssocArr;
}
任何帮助或建议将不胜感激。
注意:我使用的是 Eloquent 模型,但没有使用“laravel”
【问题讨论】:
-
为什么是
标签?你想要一个 SQL 查询吗? -
是的,查询构建器。对不起,我不是他们的粉丝。就个人而言,我可能会做一个(相关的)子查询来计算总数,然后加入它来进行排序。这是一个必须计算整个数据库的聚合查询,如果您可以将数字烘焙并维护它,它会快得多。
-
@ArtisticPhoenix 感谢您的评论。您认为可以解决或有助于解决问题的任何示例查询或子查询?
-
是的,DbFiddle 如果您想要没有推荐的用户,您可能需要进行左连接而不是内连接 (Join)
-
如果您想要名字等内容,则存在子查询。因为
referral上的分组会改为为您提供其中一个推荐用户数据,而不是实际用户数据。最好将其作为子查询来执行,因为它构建了一个较小的临时表,然后在同一级别进行所有操作,它还在较小的临时表上进行排序。你甚至可以将 ORDER BY 移动到子查询中,它不会改变任何东西。 For Example 至少据我了解它是如何优化事物的。
标签: php mysql sql optimization eloquent