У меня есть таблица под названием Assessment_data:
Он собирает оцениваемый_уровень для данной комнаты / идентификатора оценки / предмета / единицы / результата ряда студентов по определенному предмету.
Это мой запрос Laravel:
$assessment_tally_levels = DB::table('assessment_data')
->join('subjects', 'assessment_data.subject_id', '=', 'subjects.id')
->select('subjects.short_name as Subject', 'assessment_data.assessed_level as Level', DB::raw('count(*) as Students'))
->where('assessment_data.user_id', Auth::id())
->where('assessment_data.room_id', $room_id)
->whereBetween('assessment_data.created_at', [$current_term->term_start." 00:00:01", $current_term->term_end." 23:59:59"])
->orderByRaw('assessment_data.assessed_level ASC')
->groupBy('assessment_data.subject_id')
->groupBy('assessment_data.assessed_level')
->get()
->toJson();
В качестве вывода JSON я получаю следующее:
[{"Subject":"Science","Level":1,"Students":16},{"Subject":"Phys Ed","Level":1,"Students":1},{"Subject":"Math","Level":1,"Students":1},{"Subject":"ELA","Level":1,"Students":2},{"Subject":"Art","Level":2,"Students":1},{"Subject":"Science","Level":2,"Students":23},{"Subject":"CTF","Level":2,"Students":1},{"Subject":"Math","Level":2,"Students":3},{"Subject":"ELA","Level":2,"Students":3},{"Subject":"Phys Ed","Level":2,"Students":3},{"Subject":"Phys Ed","Level":3,"Students":3},{"Subject":"Art","Level":3,"Students":1},{"Subject":"Science","Level":3,"Students":40},{"Subject":"Health","Level":3,"Students":4},{"Subject":"CTF","Level":3,"Students":4},{"Subject":"Math","Level":3,"Students":4},{"Subject":"ELA","Level":3,"Students":4},{"Subject":"Phys Ed","Level":4,"Students":4},{"Subject":"Science","Level":4,"Students":41},{"Subject":"Art","Level":4,"Students":4},{"Subject":"Health","Level":4,"Students":2},{"Subject":"CTF","Level":4,"Students":1},{"Subject":"Math","Level":4,"Students":4},{"Subject":"ELA","Level":4,"Students":3}]
Проблема в том, что в классе нет 40 учеников (как это указано в строке «Уровень естествознания 3» выше).
Вот ссылка на полный набор данных из приведенного выше примера (не знал, как еще поделиться с вами этими данными): https://docs.google.com/spreadsheets/d/1swc9AVLp0ZVDJw3UntgpSDQTSB2MaSunVul7zR0kNf8/edit?usp=sharing
Мне нужно сгруппировать студентов вместе по их student_id и усреднить все оцененные_уровни этого студента для предмета вместе, чтобы получить единый результат для студента.
Как я могу это сделать?
Попробуйте count(distinct student_id) as Students
.
@Spholt - Мне, наверное, действительно стоит освежить свои навыки красноречия. Каждый раз, когда запрос выходит за рамки однозначного, я просто перехожу в Query Builder для простоты (в начале). Предоставленный вами запрос выглядит красиво. В данном конкретном случае есть только две таблицы: одна для размещения данных оценки, а другая для названий жилищных субъектов. Я предполагаю, что это будет не так уж сложно настроить с помощью Eloquent ...?
@JonasStaudenmeir - это собрало студентов вместе. Есть ли способ округлить вверх / вниз студентов, у которых есть что-либо, кроме целого числа, чтобы они были объединены в те же 4 уровня целых чисел (1, 2, 3 и 4), что и другие студенты? Прямо сейчас у меня есть пара детей с оценками «2,87», «3,25» и «3,4». Я бы хотел, чтобы они были округлены до «3», «3» и «3» соответственно. (Извините, я знаю, что это выходит за рамки этой OP.
Можно опубликовать запрос, вычисляющий среднее значение?
Отмените этот запрос. Не могли бы вы опубликовать свой ответ, @JonasStaudenmeir. Это было решение. :)
@SheldonScott рад видеть, что у вас все работает :). Если вы предпочитаете использовать построитель запросов, то обязательно сделайте это, но я бы посоветовал взглянуть на документы Laravel для Eloquent ORM (laravel.com/docs/5.6/eloquent-relationships), стоит потратить время, чтобы понять некоторые другие отношения, доступные, поскольку он это самый мощный аспект Laravel, по крайней мере, на мой взгляд!
В данный момент вы подсчитываете количество оценок.
Вы должны посчитать отдельных студентов:
DB::raw('count(distinct student_id) as Students')
Какие у вас красноречивые отношения на вашей модели
Student
? Причина, по которой я спрашиваю, заключается в том, что такой запрос было бы намного проще, если бы вы могли сделать что-то вродеStudents:all()->with('assessments.results')->groupBy('assessments.subject.shortname');
.