首页 > 解决方案 > sql查询最大值,分组依据

问题描述

在此处输入图像描述

我试图让所有学生按 class_id、student_id、teacher_id 分组所以我的意思是这个:

Select id,class_id, student_id,teacher_id, max(active)
                                 FROM student_classes
                                  GROUP BY class_id, student_id, teacher_id

但这就是我得到的 在此处输入图像描述

实际上我想要的结果是:

114   137  1  47  1
108   138  2  49  0
 113  197  3  47  1

所以基本上问题出在第三排。我得到的不是 id = 113,而是 ID = 111。在这种情况下我该怎么办?你能帮我查询吗

标签: mysqlsql

解决方案


如评论中所述,MySQL 允许违反 SQL 标准,允许您在id包含group by. 据我所知,它将在每个分组中任意选择一行并显示该id行的值。

id如果您有关于要查看哪个值的特定规则,则需要在查询中表达该规则。

顺便说一句,您想要的输出似乎有多个拼写错误(例如 197,它根本不会出现在您的数据中)。

根据您的评论(您应该将其编辑到您的原始问题中)和您想要的输出,我认为您想要的id列规则是:

  • 如果组中有任何 active=1 的行,请从这些行中选择最大 id 值
  • 如果组中的所有行的 active=0,则选择最小的 id 值。(您没有具体说明这一点;我假设它是基于您所需输出的第二行存在 108 。)

我认为这个查询会产生这些结果。(并且还消除了非标准的 MySQL 行为。)

  SELECT
   COALESCE(
        MAX(CASE WHEN active=1 THEN id ELSE NULL END),
        MIN(id)
      ) AS some_id
   class_id, student_id, teacher_id, max(active)
  FROM student_classes
  GROUP BY class_id, student_id, teacher_id

推荐阅读