Php 如何从不同的列中找出两个最高值?

Php 如何从不同的列中找出两个最高值?,php,mysql,sql,Php,Mysql,Sql,我的学生评分表中有各种类型的评分,比如Quiz1,Quiz2,Quiz3,第一个月,第二个月,第三个月 我创建了一个触发器,用于计算所有标记,并在Final_marks字段中添加总和 我不想让Final\u marks字段添加所有列并求和,我只想选择前2名quick\u marks和前2名Monthly\u marks并在FinalMarks中添加它们的和 我在网上搜索并找到了从表中选择最高列值的grest关键字,但这里我不想要一个值,我需要每个ID至少有两个最高值 - Trigger[现在它正

我的
学生评分表中有各种类型的评分,比如
Quiz1
Quiz2
Quiz3
第一个月
第二个月
第三个月

我创建了一个触发器,用于计算所有标记,并在
Final_marks
字段中添加总和

我不想让
Final\u marks
字段添加所有列并求和,我只想选择前2名
quick\u marks
和前2名
Monthly\u marks
并在
FinalMarks
中添加它们的和

我在网上搜索并找到了从表中选择最高列值的
grest
关键字,但这里我不想要一个值,我需要每个ID至少有两个最高值

-

Trigger[现在它正在添加所有列]

BEGIN
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks,

如果我理解了您的问题,这里是您问题的解决方案,请使用此代码(此代码用于不理解您可以稍微修改它以适合您想要处理的数据:

DECLARE  @v_type1 INT = 0
        ,@v_type2 INT = 0
            ,@v_type3 INT = 0;

WITH temp AS (
select 1 typeid, 12 note union all
select 1 typeid, 11 note union all
select 1 typeid, 13 note union all
select 2 typeid, 18 note union all
select 2 typeid, 19 note union all
select 2 typeid, 19 note union all
select 3 typeid, 21 note)


select
         @v_type1 = @v_type1
                    +ISNULL(CASE WHEN typeid = 1 AND ROW_NUMBER()     over (partition by typeid ORDER BY note DESC)<=2
                        THEN note
                        ELSE 0
                    END,0)
        ,@v_type2 = @v_type2
                    +ISNULL(CASE WHEN typeid = 2 AND ROW_NUMBER()     over (partition by typeid ORDER BY note DESC)<=2
                        THEN note
                        ELSE 0
                    END,0)
        ,@v_type3 = @v_type3
                    +ISNULL(CASE WHEN typeid = 3 AND ROW_NUMBER()     over (partition by typeid ORDER BY note DESC)<=2
                        THEN note
                        ELSE 0
                        END,0)
    from temp


    SELECT @v_type1,@v_type2,@v_type3
声明@v_type1 INT=0
,@v_type2 INT=0
,@v_type3 INT=0;
临时工(
选择1个typeid,12个音符union all
选择1个typeid,11个note union all
选择1个typeid,13个注释union all
选择2个typeid,18个音符union all
选择2个typeid,19个注释union all
选择2个typeid,19个注释union all
选择3个typeid,21个注释)
选择
@v_type1=@v_type1

+ISNULL(当typeid=1且行数()超过(按typeid按note DESC排序)时的情况)您有五个值。要获得最大值,您可以使用最大值(当然)。要获得第二个最大值,请执行以下操作:为只有四个值的每个元组查找最大值。当然,有五个元组,一个缺少元素1,一个缺少元素2,等等。因此,您得到的值是所有五个元组中最大值的四倍,另一个是第二个最大值的一倍。使用least获得第二个最大值。就是这样

SET NEW.FinalMarks =
GREATEST(new.quizmarks, new.hourly1, new.hourly2, new.hourly3, new.projectmarks)
+
LEAST
(
  GREATEST(new.quizmarks, new.hourly1, new.hourly2, new.hourly3),
  GREATEST(new.quizmarks, new.hourly1, new.hourly2, new.projectmarks),
  GREATEST(new.quizmarks, new.hourly1, new.hourly3, new.projectmarks),
  GREATEST(new.quizmarks, new.hourly2, new.hourly3, new.projectmarks),
  GREATEST(new.hourly1, new.hourly2, new.hourly3, new.projectmarks),
)

修改此项,使其满足您的要求,分别处理测验分数和月度分数。

1.规范化您的设计+1对不起,我在吃我的单词时,它不是规范化了吗?如果我进一步划分
学生分数
表,那么每次用户更新分数时,可能很难更新
最终分数
列。