Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Laravel平均值,按类别和日期范围分组,并在单个页面上显示输出_Php_Mysql_Laravel - Fatal编程技术网

Php 使用Laravel平均值,按类别和日期范围分组,并在单个页面上显示输出

Php 使用Laravel平均值,按类别和日期范围分组,并在单个页面上显示输出,php,mysql,laravel,Php,Mysql,Laravel,我有一张像这样的桌子: $result = []; foreach($assessed_subjects as $subject) { $query = DB::table('assessment_data') ->select(DB::raw('avg(`assessed_level`) as `avg`')) ->where('user_id', 28) ->where('student_id', $student_i

我有一张像这样的桌子:

$result = [];
foreach($assessed_subjects as $subject) {
    $query = DB::table('assessment_data')
        ->select(DB::raw('avg(`assessed_level`) as `avg`'))
        ->where('user_id', 28)
        ->where('student_id', $student_id)
        ->where('subject_id', $subject->subject_id);
    foreach($user_terms as $term) {
        $result[$subject->subject_id][$term->id] = (clone $query)
            ->whereBetween('created_at', [$term->term_start, $term->term_end])
            ->first()->avg;
    }
    $result[$subject->subject_id]['year'] = (clone $query)
        ->whereBetween('created_at', [$user_terms->first()->term_start, $user_terms->last()->term_end])
        ->first()->avg;
}

我希望能够查询此表,并根据主题和日期分组显示结果。日期将满足一个范围(在x和y之间)

我希望输出如下内容:

$result = [];
foreach($assessed_subjects as $subject) {
    $query = DB::table('assessment_data')
        ->select(DB::raw('avg(`assessed_level`) as `avg`'))
        ->where('user_id', 28)
        ->where('student_id', $student_id)
        ->where('subject_id', $subject->subject_id);
    foreach($user_terms as $term) {
        $result[$subject->subject_id][$term->id] = (clone $query)
            ->whereBetween('created_at', [$term->term_start, $term->term_end])
            ->first()->avg;
    }
    $result[$subject->subject_id]['year'] = (clone $query)
        ->whereBetween('created_at', [$user_terms->first()->term_start, $user_terms->last()->term_end])
        ->first()->avg;
}
第1项-艺术-(x范围内所有评估水平的平均值)

第2项-艺术-(y范围内所有评估水平的平均值)

第3项-艺术-(z范围内所有评估水平的平均值)

这是:

第1学期-数学-(x范围内所有评估水平的平均值)

第2学期-数学-(y范围内所有评估水平的平均值)

第3学期-数学-(z范围内所有评估水平的平均值)

(等等)

如果某个日期范围没有评估的水平,那么我仍然需要它返回一个主题,该主题可能有一个“N/a”

最后,我想要一个数据表,它看起来像这样:

('E'将是平均评估水平的位置,列将是平均结果,忽略日期范围)

这是我编写的代码,但它没有提供我需要的结果:

for($b=0; $b < $assessed_subjects->count(); $b++) {
    $assessment_strengths[] = DB::table('assessment_data')
        ->join('subjects', 'assessment_data.subject_id', '=', 'subjects.id')
        ->join('units', 'assessment_data.unit_id', '=', 'units.id')
        ->join('outcomes', 'assessment_data.outcome_id', '=', 'outcomes.id')
        ->join('assessments', 'assessment_data.assessment_id', '=', 'assessments.id')
        ->select('subjects.short_name as subject_name', 'units.name as unit_name', 'outcomes.name as outcome_name', 'assessments.assessment_name as assessment_name', 'assessment_data.*')
        ->where('assessment_data.user_id', 28)
        ->where('assessment_data.student_id', $student_id)
        ->where('assessment_data.subject_id', $assessed_subjects[$b]->id)
        ->whereBetween('assessment_data.created_at', [$current_term->term_start, $current_term->term_end])
        ->orderBy('assessment_data.assessed_level', 'desc')
        ->get();
}
如您所见,有一些空值(0、1、4、5、7),我希望将一些数据推送到这些空值。我将IFNULL和COALESCE视为一种提供回退的方法,但这在本例中没有帮助。有没有一种方法可以将值(或类似的东西)附加到查询结果中,即使它们是空的


我的思考过程是,如果我能将输出的每个记录定义为属于某个特定术语,我将更接近于获得我需要的内容。

我建议这样一种方法:

$result = [];
foreach($assessed_subjects as $subject) {
    $query = DB::table('assessment_data')
        ->select(DB::raw('avg(`assessed_level`) as `avg`'))
        ->where('user_id', 28)
        ->where('student_id', $student_id)
        ->where('subject_id', $subject->subject_id);
    foreach($user_terms as $term) {
        $result[$subject->subject_id][$term->id] = (clone $query)
            ->whereBetween('created_at', [$term->term_start, $term->term_end])
            ->first()->avg;
    }
    $result[$subject->subject_id]['year'] = (clone $query)
        ->whereBetween('created_at', [$user_terms->first()->term_start, $user_terms->last()->term_end])
        ->first()->avg;
}
这将为您提供按主题和术语分组的平均级别。如果没有值,则为
NULL

或者一个查询更少的替代解决方案:

$result = [];
$query = DB::table('assessment_data')
    ->select('subject_id', DB::raw('avg(`assessed_level`) as `avg`'))
    ->where('user_id', 28)
    ->where('student_id', $student_id)
    ->whereIn('subject_id', $assessed_subjects->pluck('subject_id'))
    ->groupBy('subject_id');
foreach($user_terms as $term) {
    $rows = (clone $query)
        ->whereBetween('created_at', [$term->term_start, $term->term_end])
        ->get();
    foreach($rows as $row) {
        $result[$row->subject_id][$term->id] = $row->avg;
    }
}
$rows = (clone $query)
    ->whereBetween('created_at', [$user_terms->first()->term_start, $user_terms->last()->term_end])
    ->get();
foreach($rows as $row) {
    $result[$row->subject_id]['year'] = $row->avg;
}

唯一的缺点是,它不会为结果中缺少的平均值添加
NULL
值。

对于我们来说,这是一个非常严肃的问题,需要尝试和理解。从更具体的角度来说,它有什么问题?是的,这是一个很好的观点。我从来都不知道如何在这里详细说明我需要什么(这是我问题的一部分)!我会更新一些更具体的问题。对于这样一个复杂的问题,我想你已经很接近了,所以如果你能解释一下,要想把它推过终点线需要做些什么,这会有所帮助。在连接中,通常会出现不包含右侧数据的情况,或者是
right
LEFT
的问题。我只是添加了更多的信息,@tadman。如果有更清楚的话,请告诉我。谢谢你的回复。平均值是一个科目所有评估的平均值(也可以是所有术语的平均值,以较容易编程的为准)。一年是一个学年,而不是一个日历年(通常是九月到六月)。所以从第一学期开始到第三学期结束?是的,没错。每位教师可以自由确定自己的学期开始和结束日期,一学年最多12个学期。(这是$term->term_start和$term->term_end在循环遍历用户建立的每个术语时从中提取数据的地方。)如果您有任何其他问题,请告诉我。:)在我把代码转一转之后,让我很快给你回电话。我想这可能行得通,但我明天早上必须好好看看。我可以按原样输入它(修改了“assessed_level”的拼写,并将“$term”更改为“$user_terms”,我得到了一个结果数组。只需对它进行筛选并稍作调整,看看这是否是我所需要的。非常感谢您的帮助。我会再次与您联系。