繁体   English   中英

每个类别的MySQL SUM TOP 2记录

[英]MySQL SUM TOP 2 RECORDS FOR EACH CATEGORY

我有一张学生成绩表,正在尝试对所有学生在特定类别中的前2分加总。我在搜索类似的帖子,但未获得正确答案

我尝试对分数进行求和,但仅获得两个学生而不是所有学生的成绩,并且它没有给我正确的价值。

SELECT SUM(marks) as totalmarks,stdid 
   FROM (( select marks,stdid 
               from finalresult 
               where `subjectcategory` = 1 
                    AND `classId`='3' AND `year`='2018'  
                    AND `term`='2' AND `type`='23' 
               order by marks  desc 
               LIMIT 2 ))t1  
   GROUP BY stdid

辅助子查询可用于迭代

    SELECT
        stdid, marks
    FROM
    (
        SELECT stdid, marks,
               @rn := IF(@iter = stdid, @rn + 1, 1) AS rn,
               @iter := stdid
         FROM finalresult
         JOIN (SELECT @iter := NULL, @rn := 0) AS q_iter
        WHERE `subjectcategory` = 1 
          AND `classId`='3' 
          AND `year`='2018'  
          AND `term`='2' 
          AND `type`='23'  
        ORDER BY stdid, marks DESC
    ) AS T1
    WHERE rn <= 2

此解决方案忽略联系,每个学生ID仅需两个。

演示版

在MySQL 8+中,您可以执行以下操作:

SELECT stdid, SUM(marks) as totalmarks
FROM (SELECT fr.*,
             ROW_NUMBER() OVER (PARTITION BY stdid ORDER BY marks DESC) as seqnm
      FROM finalresult fr
      WHERE subjectcategory = 1 AND 
            classId = 3 AND 
            year = 2018 AND  
            term = 2 AND
            type = 23 
     ) fr
WHERE seqnum <= 2
GROUP BY stdid;

请注意,我删除了单引号。 看起来像数字的东西可能是。 而且,您不应该混合使用类型-如果值确实存储为字符串,则将引号放回去。

在较早的版本中,可能最简单的方法是使用变量,但是您必须非常小心。 MySQL不保证SELECT中变量的求值顺序,因此您不能在一个表达式中分配变量,而在另一个表达式中使用它。

一个复杂的表达式解决了这个问题。 另外,最好在子查询中排序(最新版本的MySQL 5+要求这样做):

SELECT stdid, SUM(marks) as totalmarks
FROM (SELECT fr.*,
             (@rn := IF(@s = stdid, @rn + 1,
                        IF(@s := stdid, 1, 1)
                       )
             ) as seqnum
      FROM (SELECT fr.*
            FROM finalresult fr
            WHERE subjectcategory = 1 AND 
                  classId = 3 AND 
                  year = 2018 AND  
                  term = 2 AND
                  type = 23 
            ORDER BY stdid, marks DESC
           ) fr CROSS JOIN
           (SELECT @s = '', @rn := 0) params
WHERE seqnum <= 2
GROUP BY stdid;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM