【问题标题】:MySQL JOIN/AGGREGATE function outputMySQL JOIN/AGGREGATE 函数输出
【发布时间】:2021-09-09 20:37:00
【问题描述】:

我的数据库中有两个表:

从标记中选择 *;

从主题中选择 *;

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

student_id subject_name maximum_marks
1 PHYSICS 97.5
2 CHEMSITRY 98.5

请帮我为上述结果集编写查询

这是我迄今为止尝试过的

选择 m.student_id, s.subject_name, max(m.marks) 作为 maximum_marks from 标记 m 内连接主题 s 在 m.subject_id=s.subject_id 按 m.subject_id 分组;

输出:

【问题讨论】:

  • 你试过什么?这显然是功课,SO 不是代码编写服务。首先,您真诚地尝试解决问题,如果不起作用,请与我们分享。
  • 而且,顺便说一句,这并不难。首先,生成一个生成 student_id、subject_name 和标记的 JOIN 查询。简单。从那里,您只需使用 GROUP BY 子句将其更改为 MAX(marks) AS maximum_marks
  • 选择 m.student_id, s.subject_name, max(m.marks) as maximum_marks from marks m inner join subject s on m.subject_id=s.subject_id group by s.subject_id;我已经使用了上面的查询,但是 student_id 列在两行中都是 1。
  • 如果有平局,你想要什么? select version(); 显示什么?
  • 8.0.22 -> mysql 版本 你可以假设这种情况没有平局。

标签: mysql join aggregate-functions


【解决方案1】:

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");

【讨论】:

  • 谢谢,所以如果没有内部查询,我们就不能输出?
  • @SRIHARSHASVS 我通常更喜欢子查询,因为它易于处理尝试select m.student_id, s.subject_name, m.marks as maximum_marks from marks m LEFT OUTER JOIN marks AS m2 ON m.student_id = m2.student_id AND m.marks > m2.marks inner join subjects s on m.subject_id=s.subject_id group by m.subject_id
  • 谢谢akshay,这有帮助,同时你能看看我的解决方案吗,我想我们可以用一种相对简单的方式来实现。
【解决方案2】:

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

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);

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 1970-01-01
    • 2022-10-14
    • 2019-02-01
    • 2023-03-05
    • 2011-01-23
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多