MySQL JOIN/AGGREGATE 函数输出

MySQL JOIN/AGGREGATE function output

我的数据库中有两个表:

select * 来自分数;

select * 来自主题;

我需要找到在每个科目中获得最高分的学生的 ID 以及科目名称,即结果集应该有 3 列:

student_id subject_name maximum_marks
1 物理学 97.5
2 化学 98.5

请帮我写出上面结果集的查询

这是我目前尝试过的方法

select m.student_id, s.subject_name, max(m.marks) 作为 maximum_marks 来自 标记 m inner join subjects s 在 m.subject_id=s.subject_id 按 m.subject_id;

分组

输出:

SQL Fiddle Demo

select m.student_id, s.subject_name, m.max_marks
from subjects s join (
 select student_id,subject_id, max(marks) as max_marks 
 from marks 
 group by student_id,subject_id
 order by 3 desc
) as m
on s.subject_id = m.subject_id 
group by s.subject_id

架构和示例 & ONLY_FULL_GROUP_BY 已禁用

CREATE TABLE IF NOT EXISTS `marks` (
  `student_id` int(6) NOT NULL,
  `subject_id` int(6)  NOT NULL,
  `marks` float NOT NULL
) DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `subjects` (
  `subject_id` int(6)  NOT NULL,
  `subject_name` varchar(10)  NOT NULL
) DEFAULT CHARSET=utf8;

INSERT INTO `marks` (`student_id`, `subject_id`, `marks`) VALUES
(1,1,97.5),(1,2,92.5),
(2,1,90.5),(2,2,98.5),
(3,1,90.5),(3,2,67.5),
(4,1,80.5),(4,2,97.5);

INSERT INTO `subjects` (`subject_id`, `subject_name`) VALUES
(2,"Chemistry"),(1,"Physics");

我找到了更好的解决方案,这是相关子查询的常见用例,无需分组即可实现输出。

select m1.student_id, m1.subject_id, m1.marks, s.subject_name
from marks m1 inner join subjects s
on m1.subject_id=s.subject_id
where m1.marks= 
(select max(marks) from marks m2 where m1.subject_id=m2.subject_id);