我有一个数据库表students
,其中包含每个科目的所有科目的最终成绩,这是一个相当大的数字,还有许多其他字段,例如名称等。
students
(表格有100列以上,每个单元格可以具有一些预设ID,后来将其转换为等级/一些愚蠢的反黑客技术,其中多个数字可以代表相同的等级/ )
|| name || surname|| section || math1||math 2||math 16|| physics 1||physics 2 ||... ||
|| Jonah || Smith || A4 || 17 || 19 || 0 || 193 || ||
|| John ||Doe || A3 || 0 || 0 || 34 ||12 || 0 || ...||
|| Jane ||Doe || A3 || 0 || 0 || 48 ||12 || 154 || ...||
|| Martin||Doe || A3 || 17 || 34 || 96 ||10 || 225 || ...||
理想结果
|| avg.grade || name || surname|| section || math1||math 2||math 16|| physics 1||physics 2||... ||
|| 0.92 || John ||Doe || A3 ||0 || 0 ||... ||12 || 0 || ...||
|| 0.81 || Jane ||Doe || A3 ||0 || 0 ||... ||12 || 154 || ...||
除了
,实际上没有其他相关表。我想选择所有字段(使用Laravel雄辩模型)和“最终成绩”,这是所有所选内容的总和...高于某个阈值。 (如下所示
SELECT *, a FROM `students` WHERE
`name` LIKE "J%" AND `surname` LIKE "D" AND `section` = 'A3'
enter code here
AND (if(`math16`='12',0.76, 0)
+if(`geometry26`='13',0.76, 0) +if(`physics13`='325',1, 0)
+if(`programming06`='551',1, 0) +if(`biology18`='271',0.916, 0)
+ .... )/18.216 as a > 0.75
'12','13','25','551','271'-是等级代码。
从技术上讲,我需要让所有学生或多或少的学生获得相同的课程,并且对于给定的名字起初字母都具有一定的平均成绩。 (我的意思是,如果我有约翰,他修过特定的课程[数学等级为0.76的数学16,生物学等级为0.91的生物学...,]和简[数学等级为0.76的数学16,编程等级为100的编程06,...],我想在没有其他学生的情况下将他们的成绩和成绩汇总在一起。
可能还有其他可能性将所有具有相同字段的行放在一起,但我无法做到这一点。 谢谢
答案 0 :(得分:1)
我不建议将主题保留在students
表中,而是应该进一步研究规范化数据库并添加subjects
和student_subject
表。但是,使用当前设置,您可以考虑在模型上创建属性,然后将其附加。
https://laravel.com/docs/5.7/eloquent-serialization#appending-values-to-json
class User {
protected $appends = [
'average_grade'
];
public function getAverageGradeAttribute()
{
return $this->attributes['average_grade'] = ($this->math1 + $this->math2) / 2;
}
}
这样做可以让您在视图中显示属性时简单地调用它,就像这样:
<table>
<thead>
<tr>
<th>Student</th>
<th>Average Grade</th>
</tr>
</thead>
<tbody>
@foreach($students as $student)
<tr>
<td>{{ $student->name }}</td>
<td>{{ $student->average_grade }}</td>
</tr>
@endforeach
</tbody>
</table>
答案 1 :(得分:0)
您可以执行以下操作来实现您的目的。假设您想获得表中 2 个字段的单个总和的总和,其中字段名称为 field1 和 field2,对于模型名称为 'ModelName' 的表,您可以执行以下操作:
$amount = ModelName::select(DB::raw('sum(field1 + field2) as total'))->get();