Dreamer Dreamer
首页
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

lycpan233

白日梦想家
首页
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • Mysql

    • 浅谈char与varchar尾随空格对比
    • utf8存储emoji处理
    • Mysql 查询每个班级的前几名
      • AI 解析
      • 拓展
    • Text为什么不支持设置默认值
    • Mysql 事务级别与差异
    • Mysql SQL 优化思路
  • Node

  • Go

  • Docker

  • 后端
  • Mysql
lycpan233
2024-07-20
目录

Mysql 查询每个班级的前几名

# AI 解析

在 MySQL 5.7 中,由于不支持 ROW_NUMBER() 函数,我们可以使用变量来实现类似的功能。以下是一个示例,展示如何在 MySQL 5.7 中查询每个班级的前三名学生:

假设有一个名为 students 的表,包含以下列:id(学生编号)、class(班级)、name(学生姓名)和 score(分数)。

  1. 创建示例数据
CREATE TABLE students (
    id INT PRIMARY KEY,
    class VARCHAR(20),
    name VARCHAR(50),
    score INT
);

INSERT INTO students (id, class, name, score) VALUES
(1, 'ClassA', 'Alice', 85),
(2, 'ClassA', 'Bob', 90),
(3, 'ClassA', 'Charlie', 88),
(4, 'ClassA', 'David', 92),
(5, 'ClassA', 'Eve', 87),
(6, 'ClassB', 'Frank', 80),
(7, 'ClassB', 'Grace', 85),
(8, 'ClassB', 'Heidi', 82),
(9, 'ClassB', 'Ivan', 88),
(10, 'ClassB', 'Judy', 90);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  1. 查询每个班级的前三名学生:
SET @rank := 0;
SET @class := '';

SELECT id, class, name, score
FROM (
    SELECT id, class, name, score,
           @rank := IF(@class = class, @rank + 1, 1) AS rank,
           @class := class
    FROM students
    ORDER BY class, score DESC
) AS ranked_students
WHERE rank <= 3;
1
2
3
4
5
6
7
8
9
10
11
12

解释:

  • 使用变量 @rank 和 @class 来跟踪每个班级的排名。
  • IF(@class = class, @rank + 1, 1):如果当前记录的班级与前一记录的班级相同,则排名加 1;否则,排名重置为 1。
  • 外层查询过滤出排名小于等于 3 的记录,即每个班级的前三名学生。

# 拓展

如果不想写 SET XXX 这段语法,可以把定义变量,放到一个临时表中。

SELECT id, class, name, score
FROM (
    SELECT id, class, name, score,
           @rank := IF(@class = class, @rank + 1, 1) AS rank,
           @class := class
    FROM students, (SELECT @rank := 0, @class := '') AS temp
    ORDER BY class, score DESC
) AS ranked_students
WHERE rank <= 3;
1
2
3
4
5
6
7
8
9

这段语句,把变量定义存在了临时表中。依赖的特性是 SQL 的执行顺序。 我自测得出的结论是: FROM => SELECT => WHERE; 以下语句大家可以自行调试;

SET @num := 0;

SELECT @num := 1
FROM (SELECT @num := 2) temp
WHERE 1 > (SELECT @num := 3);

SELECT @num;
1
2
3
4
5
6
7
编辑 (opens new window)
上次更新: 2025/04/15, 03:48:14
utf8存储emoji处理
Text为什么不支持设置默认值

← utf8存储emoji处理 Text为什么不支持设置默认值→

最近更新
01
docker基础概念
02-26
02
js 获取变量准确类型
02-19
03
Mysql SQL 优化思路
02-18
更多文章>
Theme by Vdoing | Copyright © 2023-2025 Dreamer | MIT License
粤ICP备2025379918号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式