Php 很有说服力,如何在一个新字段中计算字段的总和

Php 很有说服力,如何在一个新字段中计算字段的总和,php,laravel,eloquent,dynamicquery,Php,Laravel,Eloquent,Dynamicquery,我有一个DB表,上面有所有科目的学生,每个科目的最终成绩,这是一个相当大的数字,还有一些其他字段,如姓名等 students表有100多列,每个单元格可以有一些预先设置的ID,这些ID稍后会转换为分数/一些愚蠢的反黑客技术,其中几个数字可以代表同一个分数/ || name || surname|| section || math1||math 2||math 16|| physics 1||physics 2 ||... || || Jonah || Smith || A4 ||

我有一个DB表,上面有所有科目的学生,每个科目的最终成绩,这是一个相当大的数字,还有一些其他字段,如姓名等

students表有100多列,每个单元格可以有一些预先设置的ID,这些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     || ...||
除了

具有到IDs表示的等级的辅助内存表 科目和学生数据 我想得到选择使用拉威尔雄辩模型所有领域和'最终成绩',什么是所有选定的总和。。。高于某个阈值。 下文介绍了这些建议

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”是等级代码

从技术上讲,我需要让所有的学生,他们或多或少地得到了相同的课程,在一个给定的起始字母的名字的一些平均成绩。 我的意思是,如果我有约翰,他选修了特定的课程[数学16,成绩为0.76,生物学18,成绩为0.91,…]和简[数学16,成绩为0.76,编程06,成绩为100,…],我想把他们的成绩和他们的成绩汇总在一起,而不包括其他学生

可能还有其他一些可能,可以将所有具有相同字段的行放在一起,但我不知道如何才能做到这一点。
谢谢

我不建议将主题保留在students表中,相反,您应该进一步探索规范化数据库,并添加主题和student_主题表。但是,使用当前设置,可以考虑在模型上创建属性,然后附加它。

这样做将允许您在视图中显示属性时只需调用该属性,如下所示:

<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>

你可以做以下事情来达到你的目的。假设您希望获得表中2个字段的单独总和,其中字段名称为“ModelName”的表的字段名称为field1和field2,则可以执行以下操作:

$amount = ModelName::select(DB::raw('sum(field1 + field2) as total'))->get();

你能提供一个学生表格/模型的样本和记录吗?你想要的结果是什么?目前还不是很清楚。我的意思是用数据更新你的问题,你的sql语句,这对我来说没有什么帮助。还有你的相关表主题,…@HCK,添加了一些tables@DCR:欢迎就原始海报如何改进其问题提出具体建议,但是责骂OP是没有帮助的。我认为你应该对你的数据库建立一个稍微不同的模型来解耦你的列。学生表中有>100列,这不是很有用,因为——我假设——学生不会同时选修所有这些课程。您可以有一个包含基本学生信息的学生表,然后是一个主题表,其中包含与本课程相关的所有成绩,还可以指定确定应用于该课程的实际成绩的算法。。。然后是另一个表格,其中您将学生与特定学期/课程周期的课程联系起来。谢谢,1。我不知道如何重构/规范化这个表。原因是:预先设置的主题不是那么大,也不是很密集。2.我曾想过这样做,添加一个属性,但请求只是来自about zillion ok的请求,不是zillion,而是~20:。出于某种原因,我确信添加属性会影响每个查询。看来我错了,谢谢。这不是关于科目和学生,但由于保密协议,我不得不重新表述我的问题:4.看来我要在where子句中进行计算。否则会非常耗时。我有上千张唱片没有问题Alexey。您可以做的最有效的事情是规范化数据库。以后这样做会非常耗时,而且只会阻止您扩展应用程序。Ian,这个表已经有数万条记录了。我不知道如何在不破坏所有其他记录的情况下使其正常化。^ u^。-“学生记录”只是系统中的一块“砖头”。每个字段都是加密的。只有在这个特定的查询中,我们才能访问一些字段,能够对它们进行解密并计算出一些结果。
$amount = ModelName::select(DB::raw('sum(field1 + field2) as total'))->get();