【问题标题】:MySQL MAX value with 2 conditionsMySQL MAX 值有 2 个条件
【发布时间】:2021-01-20 15:51:44
【问题描述】:

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

棘手的部分是比赛的规则。每个参与者都必须在各自的学校和班级中获得此身份。所以我必须在每个学校和每个班级都有获奖者。用第 2 名和第 3 名来更新表格非常简单,因为它们被视为 result >= 50 并且 result

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

UPD。例子

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   |

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 |

基本上,每个学校和班级的第 1 名是 MAX,第 2 名小于 MAX 并且 >= 50,第 3 名刚好小于 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

我也尝试过使用子查询,但显然没有帮助 - 不同的子查询甚至给出不同的行数,或者生成的“状态”与分数和其他信息不匹配。

【问题讨论】:

  • 您能否为您的输入数据创建Minimal, Reproducible Example 以及您希望为该示例数据获得什么结果?
  • 请提供表格架构、示例数据和预期结果
  • 并显示您尝试过的无效
  • 查询中为什么会出现参与者表?
  • 请学习如何使用GROUP BY。您的查询无效。

标签: mysql sql group-by max


【解决方案1】:

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

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;

这里是小提琴:SQLize.online

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多