Mysql 仅对表中的少数/有限行求和或计数

Mysql 仅对表中的少数/有限行求和或计数,mysql,sql,database,Mysql,Sql,Database,我有一个学生分数表,在那里我按科目给学生打分。我想每个学生最多选修3门课。并且还想看看一个学生在这个表组中有多少科目标记条目。这是我的桌子结构 students ---------------------- id | name | roll ---------------------- 1 | Rahim | 201 2 | Kalas | 203 ---------------------- student_marks -------------------

我有一个学生分数表,在那里我按科目给学生打分。我想每个学生最多选修3门课。并且还想看看一个学生在这个表组中有多少科目标记条目。这是我的桌子结构

students
----------------------
id |    name    | roll
----------------------
1  | Rahim      | 201
2  | Kalas      | 203
----------------------
student_marks
--------------------------------
id | student_id | subject | mark
--------------------------------
1  |    1       |   A     | 10
2  |    1       |   B     | 5
3  |    1       |   C     | 10
4  |    1       |   D     | 5
5  |    2       |   A     | 10
6  |    2       |   B     | 10
--------------------------------
my_expected_table
----------------------------------
student_id | student_name | sum
----------------------------------
1          | Rahim        | 25
2          | Kalas        | 20
----------------------------------
我正在尝试,但不明白如何在这里限制连接表的示例查询

SELECT students.id as student_id,
       students.name as student_name,
       sum(student_marks.mark) as sum
From students
inner join student_marks on student_marks.student_id = students.id
Group by student_marks.student_id
您知道的查询输出,它将显示所有行的总和。但我想要上一张桌子“我的桌子”


在MySQL中这样做很痛苦。最好的方法是使用变量:

select sm.student_id, count(*) as num_marks,
       sum(case when rn <= 3 then mark end) as random_3_sum
from (select sm.*,
             (@rn := if(@s = student_id, @rn + 1,
                        if(@s := student_id, 1, 1)
                       )
             ) as rn
      from student_marks sm cross join
           (select @rn := 0, @s := -1) params
      order by student_id, id
     ) sm
group by sm.student_id;
选择sm.student\u id,将(*)计为num\u标记,

sum(rn时的情况)在MySQL中这样做很痛苦。最好的方法是使用变量:

select sm.student_id, count(*) as num_marks,
       sum(case when rn <= 3 then mark end) as random_3_sum
from (select sm.*,
             (@rn := if(@s = student_id, @rn + 1,
                        if(@s := student_id, 1, 1)
                       )
             ) as rn
      from student_marks sm cross join
           (select @rn := 0, @s := -1) params
      order by student_id, id
     ) sm
group by sm.student_id;
选择sm.student\u id,将(*)计为num\u标记,

求和(如果是这样的话,你要解决的问题是不是对学生1(Rahim)来说,你实际上要求和四行,而不是三行?如果你把它限制在三行,你想要哪三行-前三个分数?后三个分数?前三个是按主题排序的?实际上现在我只想得到三行现在任意三行(上/下/按顺序排列)。我想如果我知道如何取三行,那么我可能会想出如何排序或排序:)。谢谢使用行号生成前三行,然后您就可以轻松地完成。我将在哪里使用行号生成前三行。您能简单地告诉我吗。谢谢,您试图为学生1(Rahim)解决的问题是什么,你实际上是在总结四行,而不是三行?如果你把它限制在三行,你想要哪三行-最上面的三个标记?最下面的三个标记?按主题排序的前三行?实际上现在我只想得到三行现在任意三行(最上面/最下面/按顺序排序)。我想如果我知道如何取三行,那么我可能会想出如何排序或排序:)。谢谢使用ROW_NUMBER生成前3行,然后您就可以轻松地完成。我将在哪里使用ROW NUMBER生成前3行。你能简单地告诉我吗。谢谢这个代码在我脑子里乱转,因为我不擅长mysql。对不起。你能给我推荐一些学习mysql的资源来解决痛苦的工作吗。你有没有更容易解决的计划。Thanks@rana7cse . . . 如果有一种更简单的方法来编写查询,我会这样写的。这段代码让我不知所措,因为我不擅长mysql。你能给我推荐一些学习mysql的资源来解决痛苦的工作吗。你有没有更容易解决的计划。Thanks@rana7cse . . . 如果有一种更简单的方法来编写查询,我会这样写。