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;
分组
输出:
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);
我的数据库中有两个表:
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;
分组输出:
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);