首页 > 解决方案 > 从 3 个不同的主题中为一个 id 找到 max(marks),对于第二个 id 类似,依此类推

问题描述

从 3 个不同的主题中为一个 id 找到 max(marks),对于第二个 id 类似,依此类推。

表名 - 学生

+---------+---------+-------+
| stud_id | Subj    | Marks |
+---------+---------+-------+
| 1       | ENGLISH | 60    |
+---------+---------+-------+
| 1       | MATHS   | 50    |
+---------+---------+-------+
| 1       | HINDI   | 65    |
+---------+---------+-------+
| 2       | ENGLISH | 70    |
+---------+---------+-------+
| 2       | MATHS   | 20    |
+---------+---------+-------+
| 2       | HINDI   | 57    |
+---------+---------+-------+
| 3       | ENGLISH | 72    |
+---------+---------+-------+
| 3       | MATHS   | 88    |
+---------+---------+-------+
| 3       | HINDI   | 62    |
+---------+---------+-------+

结果应该是:

+---------+---------+-------+
| stud_id | Subj    | Marks |
+---------+---------+-------+
| 1       | HINDI   | 65    |
+---------+---------+-------+
| 2       | ENGLISH | 70    |
+---------+---------+-------+
| 3       | MATHS   | 88    |
+---------+---------+-------+

询问:

SELECT STUD_ID, SUBJ, MAX(MARKS) marks FROM STUDENT group by id;

标签: mysql

解决方案


在平等的情况下,我采用两个 ID。

如果不是这种情况,请删除GROUP BY并替换GROUP_CONCAT()DISTINCT s1.Subj

SELECT GROUP_CONCAT(DISTINCT s1.stud_id
                    ORDER BY s1.stud_id ASC SEPARATOR ', '),
       s1.Subj,
       s1.Marks
FROM Student s1
   LEFT JOIN Student s2 ON s1.Marks < s2.Marks
     AND s1.Subj = s2.Subj
WHERE s2.stud_id IS NULL
GROUP BY s1.Subj

你可以在这里测试

实际具有LEFT JOIN最大值的行将NULL位于右侧。然后,我过滤连接结果,仅显示右侧为 NULL 的行。


推荐阅读