Laravel Nested Query - PullRequest
       4

Laravel Nested Query

0 голосов
/ 28 апреля 2018

Мне трудно получить правильный запрос для этого в 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 голосов
/ 28 апреля 2018

У 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; 
0 голосов
/ 28 апреля 2018

Вам вообще не нужно объединять таблицы. Вы можете решить эту проблему с помощью простого метателя молнии.

// 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);
}
0 голосов
/ 28 апреля 2018
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, используя запрос выше.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...