Laravel嵌套查询

时间:2018-04-28 05:56:43

标签: sql laravel

我很难在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中是如何工作的。

3 个答案:

答案 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);
}