gpt4 book ai didi

mysql - 我正在使用 MYSQL 计算学生表中每个科目的 TOP-N。

转载 作者:行者123 更新时间:2023-11-29 17:30:03 26 4
gpt4 key购买 nike

我有一个学生表,其中包含student_id、分数和科目

CREATE TABLE IF NOT EXISTS students 
(student_id INT(3), subject ,VARCHAR(45), score INT(3) );

插入的数据是

insert into students values(1,'math',70);
insert into students values(1,'science',71);
insert into students values(1,'history',72);
insert into students values(1,'english',73);
insert into students values(1,'kannada',74);
insert into students values(3,'math',50);
insert into students values(3,'science',51);
insert into students values(3,'history',52);
insert into students values(3,'english',53);
insert into students values(3,'kannada',54);
insert into students values(2,'math',60);
insert into students values(2,'science',61);
insert into students values(2,'history',62);
insert into students values(2,'english',63);
insert into students values(2,'kannada',64);

使用查询后我得到了所需的输出,

select student_id,score,subject
from
(select @prev := '', @n:=0) init
join
(select @n := if(subject != @prev , 1, @n+1) as n,
@prev := subject,
student_id,score,subject from students
order by
subject asc,
score desc
) x
where n<=2
order by subject, score desc;

我根本不明白这是如何工作的,为什么需要加入?这是子查询吗? from 子句中的语句是否会针对每一行数据运行?请有人给我解释一下。我正在学习SQL。

注意:我在网上发现了与此类似的查询,我只是对其进行了调整以满足我的要求,这不是我的工作。

最佳答案

连接只是需要的,以便您可以初始化变量 @prev@n在查询中。这需要与您尝试过滤的查询分开完成。您可以在查询之前执行此操作,但这会将所有内容放在一个独立的查询中。

SET @prev = '';
SET @n = 0;
SELECT student_id, score, subject
FROM
(select @n := if(subject != @prev , 1, @n+1) as n,
@prev := subject,
student_id,score,subject from students
order by
subject asc,
score desc
) x
where n<=2
order by subject, score desc;

在本例中使用子查询,以便您可以选择 n <= 2您想要的行。

关于mysql - 我正在使用 MYSQL 计算学生表中每个科目的 TOP-N。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50730967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com