我有3张表--学生表、系表和考试结果表.我在这里try 做的是 Select 所有具有最高分数的部门名称/s,例如6.

我try 了以下查询,但在本例中,我们有2个6级的部门,但信息学部门有2个最高年级,而化学只有1个.我仍然在检索不应返回的化学系名称,而只返回化学系名称(此外,如果我们有2个最高年级的化学,我们应该能够检索信息学和化学记录).

SELECT department
FROM (SELECT d.department_name as department, count(e_r.grade) as cnt
      FROM exam_results e_r
      INNER JOIN students s ON e_r.student_id = s.student_id
      INNER JOIN department d ON s.department_id = d.department_id
      WHERE e_r.grade = 6
      GROUP BY d.department_name
     ) as ex;

另外,通过下面的查询,我能够在WHERE子句中检索部门名称和给定‘n’级的计数,但由于某些原因,我无法实现我真正想要的结果.

SELECT department_name, max(cnt) as cnt
FROM (SELECT d.department_name as department_name, e_r.grade, count(e_r.grade) as cnt
      FROM exam_results e_r
      INNER JOIN students s ON e_r.student_id = s.student_id
      INNER JOIN department d ON s.department_id = d.department_id
      WHERE grade = 6
      GROUP BY d.department_name, e_r.grade
     ) AS ex
GROUP BY department_name;

使用所解释的示例提供一个dbfiddle链接:https://dbfiddle.uk/siEjfNXP

将很高兴收到任何关于如何实现这一点的建议或提示,谢谢!

以下是带有示例值的表(全部包含在dbfiddle链接中):

学生桌:

student_id department_id
1 1
2 1
3 2
4 2
5 3
6 3
7 4
8 4
9 5
10 5

部门表:

department_id department_name
1 Informatics
2 Biology
3 Physics
4 Geography
5 Chemistry

EXAM_RESULTS表:

student_id grade
1 6
2 6
3 4
4 4
5 3
6 3
7 2
8 2
9 6
10 5

推荐答案

如果您只想要一行(分数最高的部门),您可以按分数降序排序,然后将行数限制为1.

SELECT d.department_name as department
FROM exam_results e_r
INNER JOIN students s ON e_r.student_id = s.student_id
INNER JOIN department d ON s.department_id = d.department_id
WHERE e_r.grade = 6
GROUP BY d.department_name
ORDER BY COUNT(e_r.grade) DESC
LIMIT 1

查看演示here.


如果您允许多个最大值,您可以使用DENSE_RANK窗口函数为您的计数分配排名顺序,然后获得denserank=1的所有记录.

SELECT department
FROM (SELECT d.department_name as department,
             DENSE_RANK() OVER(ORDER BY COUNT(e_r.grade) DESC) AS rn
      FROM exam_results e_r
      INNER JOIN students s ON e_r.student_id = s.student_id
      INNER JOIN department d ON s.department_id = d.department_id
      WHERE e_r.grade = 6
      GROUP BY d.department_name
     ) AS ex
WHERE rn = 1

查看演示here.

Mysql相关问答推荐

MySQL InnoDB:可以在没有回滚损失的情况下从运行的查询中进行大型插入吗

基于多行从表中 Select

获取最大登录应用程序用户数以及何时

没有 ORDER BY 的查询性能很高,有 ORDER BY 的查询速度慢得像爬行一样

查找表中的唯一记录

MySQL 关于 JSON 数组和子查询的问题

Select 构成每天聚合 MAX 的各个行

在 MySQL 中,如何对 LIKE 查询进行批量更新,删除字符?

go&mysql&docker 拒绝连接

将sql查询转换为sequelize

在 Spring Data jpa 中的 @Query 中无法识别本机查询

MySQL DISTINCT 日期仅返回特定表的 1 个值.相同的查询适用于其他表

仅当其他行相等时才 Select 行值

MySQL 8.0.30 正则表达式词匹配特殊字符

Golang Gorm没有从关联表中检索数据

SQL 中的双杠 (||) 是什么意思?

Laravel $q->where() 日期之间

在 MySQL 中,我应该 Select 哪种排序规则?

MySQL:切换 int 字段值的简单方法

MySQL CREATE TABLE 语句中的 PRIMARY KEY 定义