Mysql 仅对表中的少数/有限行求和或计数
我有一个学生分数表,在那里我按科目给学生打分。我想每个学生最多选修3门课。并且还想看看一个学生在这个表组中有多少科目标记条目。这是我的桌子结构Mysql 仅对表中的少数/有限行求和或计数,mysql,sql,database,Mysql,Sql,Database,我有一个学生分数表,在那里我按科目给学生打分。我想每个学生最多选修3门课。并且还想看看一个学生在这个表组中有多少科目标记条目。这是我的桌子结构 students ---------------------- id | name | roll ---------------------- 1 | Rahim | 201 2 | Kalas | 203 ---------------------- student_marks -------------------
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 . . . 如果有一种更简单的方法来编写查询,我会这样写。