【发布时间】:2016-09-14 16:42:46
【问题描述】:
为清晰而编辑:
我需要一些方法让这个查询只返回不同的 course_ids
->wherein('course_id', $array)
查询的一部分。它获取已完成课程的总数,但如果用户多次完成课程,则将其计入总数。因此,如果您想知道有多少学生完成了一门课程,如果学生不止一次完成了一门课程,则该数字将关闭。
public function report_count(){
$array = \Session::get('course_report')['course'];
return $this->hasOne('Tracking', 'roster_id')
->selectRaw('roster_id, count(*) as aggregate')
->where('status', 1)
->wherein('course_id', $array)
->groupBy('roster_id');
我尝试在最后添加 groupBy('course_id') 但它不起作用。
【问题讨论】:
-
这个统计数据可以在 cronjob 中生成吗?
-
这是内存问题吗?超时问题?您可以对查询进行分块,或通过 cron 对其进行预处理。您是否使用调试栏来查看您的查询是什么样的?
-
一开始是内存问题。我增加了内存,现在我相信它超时了。我们已经有很多 cronjobs,但我可以咨询高级开发人员,看看他是否对预运行这些任务有任何想法。我一直在使用调试栏,花名册的查询很好,然后它为每个关系吐出 n+1 个查询。我尝试预先加载查询,但它只是将每个已完成课程的值更改为 0。
-
这可能有帮助,也可能没有帮助,但是您是否在数据库上运行过类似的查询?您确定数据库已正确索引吗?是否有机会进一步索引数据库以帮助您的事业?例如,您是否使用过 mysql EXPLAIN 子句来查看查询使用的索引?如果存在数据库问题,则查询调整不太可能有帮助。最后你能分享一下数据库结构吗?
-
是的,数据库运行良好,即使是大型查询。使用 jarek tkaczyk 的急切加载技术查看我对问题底部的编辑。我可以在不到半秒的时间内完成所有的比赛,唯一的问题是它没有给我正确的总数。我只需要知道在 where() 中运行什么样的子查询来获得正确的完成课程计数。
标签: php mysql laravel eloquent