MySQL 具有 2 个条件的最大值

MySQL MAX value with 2 conditions

我正在尝试用学生竞赛的结果更新 SQL table。对于那场比赛,我有 2 tables:参与者(姓名、class、学校等)和结果(participant_id、结果和主题)。现在我需要根据他们的结果给每个参与者一个状态——第一名、第二名或第三名。

棘手的部分是那场比赛的规则。每个参与者都必须在各自的学校和 class 获得此身份。所以我必须在每个学校和每个 class 中都有获胜者。用第 2 名和第 3 名更新 table 非常简单,因为它们被计算为结果 >= 50 和结果 < 50。但是第 1 名必须是这个学校和这个 class 中的最高分。

我尝试了很多与 MAX() 语句的组合,但没有成功。无论我尝试什么,我都无法让它根据 2 个条件显示最大值(学校最大值,class 最大值)。我需要 Excel 中的 =MAXIFS() 之类的东西,但不知道如何在 SQL 中使用它。

更新。例子

Table participants

| id | name | class | school |
------------------------------
| 01 | John |  10   |  312   |
| 02 | Jack |  10   |  312   |
| 03 | Mary |  11   |  144   |
| 04 | Dany |  11   |  312   |
| 05 | Mark |  7    |  144   |

Table results

| id | participant_id | subject | score |
-----------------------------------------
| 01 |        03      |    4    |   55  |
| 02 |        01      |    4    |   75  |
| 03 |        04      |    4    |   60  |
| 04 |        05      |    4    |   45  |
| 05 |        02      |    4    |   90  |

我需要的结果必须是这样的:

| id | participant_id | subject | score |   status  |
-----------------------------------------------------
| 01 |        03      |    4    |   55  | 1st place |
| 02 |        01      |    4    |   75  | 2nd place |
| 03 |        04      |    4    |   60  | 3rd place |
| 04 |        05      |    4    |   45  | 3rd place |
| 05 |        02      |    4    |   90  | 1st place |

基本上每个学校的第一名都是MAX class,第二名小于MAX且>=50,第三名刚好小于50。

无法显示我尝试的所有内容,因为它是同一查询的所有变体。类似的东西:

SELECT
    id, participant_id, subject, score,
    (CASE
       WHEN score >= 50 THEN '2nd place'
       WHEN score < 50 THEN '3rd place'
       WHEN score = MAX(score) THEN '1st place' 
    END) AS 'status'
FROM results 
INNER JOIN participants ON results.participant_id = participants.id 
GROUP BY participant_id

我也尝试过子查询,但显然没有帮助 - 不同的子查询甚至给出不同的行数或结果 'status' 与分数和其他信息不匹配。

下一个查询可以作为解决方案:

SELECT 
    participants.*,
    results.*,
    (CASE
     WHEN score = max_score THEN '1st place' 
       WHEN score >= 50 THEN '2nd place'
       WHEN score < 50 THEN '3rd place'
       
    END) AS 'status'
FROM participants
JOIN results ON results.participant_id = participants.id 
JOIN (
  SELECT
    class, school, max(score) max_score
  FROM results 
  INNER JOIN participants ON results.participant_id = participants.id 
  GROUP BY class, school
) max_results ON 
    max_results.class = participants.class AND
    max_results.school = participants.school;

这里是 fiddle:SQLize.online