我很难在laravel中获得正确的查询。
我有桌面考试。
id | exam_name
---|------------
1 | First Exam
2 | Second Exam
3 | Third Exam
学生分数表
id | exam_id | score
----|---------|-------
1 | 1 | 15
2 | 1 | 12
3 | 1 | 10
4 | 2 | 7
5 | 2 | 16
6 | 2 | 13
我希望获得所有类似
的考试的平均分数exam_name | average_score
------------|--------------
First Exam | 12.33
Second Exam | 12
Third Exam | 0 or NULL
我尝试了左连接,但每次检查都会返回多行。 我也可以考虑使用嵌套查询,但不知道它在Laravel中是如何工作的。
答案 0 :(得分:2)
DB::table('exams')
->leftJoin('student_score','exam_id','=','exams.id')
->select('exam_name', DB::raw('AVG(score) as average_score'))
->groupBy('exam_name')->get();
您可以使用以上查询获得AVG分数。
希望这有帮助。
答案 1 :(得分:0)
使用left join
表执行Students
:
select e.exam_name, avg(s.score) avg_score
from Exams e
left join Students s on s.exam_id = e.id
group by e.exam_name;
您还可以将subquery
与关联方法
select *,
(select avg(s.score) from Students where e.exam_id = id) avg_score
from Exams e;
答案 2 :(得分:0)
您根本不需要加入表格。你可以用普通的laravel来解决这个问题。
// in your controller
$exams = Exam::with('students')->get();
// in your view you should replace this with blade
foreach ($exams as $exam) {
$exam->students->avg('score'); // Average score for each exam
}
您的考试模型应该有:
public function students()
{
return $this->hasMany(student::class);
}
你的学生班必须有反比关系:
public function exam() {
return $this->belongsTo(exam::class);
}