mysql中row_number() over功能实现

mysql中row_number() over功能实现,第1张

有时候我们想要获取每组的前n个记录,由于mysql中没有row_number() over 函数,之前部门大佬写了这个方法,觉得很实用,这里展示给大家。

student表:

s_id为学生id,s_name为学生姓名,s_birth为出生年月,s_sex为性别

score表:

s_id 为学生id,c_id为课程id,s_score为对应的成绩。

现想要取出每个课程前3名的学生信息、课程id,成绩与对应课程内排名,如下所示:

+------+--------+------------+-------+------+---------+------+

| s_id | s_name | s_birth| s_sex | c_id | s_score | rank |

+------+--------+------------+-------+------+---------+------+

| 01 | 赵雷 | 1990-01-01 | 男| 01 | 80 |1 |

| 03 | 孙风 | 1990-05-20 | 男| 01 | 80 |2 |

| 05 | 周梅 | 1991-12-01 | 女| 01 | 76 |3 |

| 01 | 赵雷 | 1990-01-01 | 男| 02 | 90 |1 |

| 07 | 郑竹 | 1989-07-01 | 女| 02 | 89 |2 |

| 05 | 周梅 | 1991-12-01 | 女| 02 | 87 |3 |

| 01 | 赵雷 | 1990-01-01 | 男| 03 | 99 |1 |

| 07 | 郑竹 | 1989-07-01 | 女| 03 | 98 |2 |

| 02 | 钱电 | 1990-12-21 | 男| 03 | 80 |3 |

+------+--------+------------+-------+------+---------+------+

查询实现如下:

首先看表b的部分,令@current_id=c_id,当c_id不是当前的课程时,rank重新从1开始计数,某则在在当前rank上加1。

需要注意的是,此时的排序需要现基于课程id,再基于成绩逆序。

在此基础上基于s_id连接student表即可,另外在最后的条件设定中需要用having不能用where,因为在原表中是不存在rank字段的,这是我们为了取数所构造的。

mysql中解决row的问题:

1、判断Select得到的行数用found_rows()函数进行判断。

2、判断Update或Delete影响的行数用row_count()函数进行判断,这里需要注意,如果Update前后的值一样,row_count则为0,而不像SqlServer里的@@rowcount或Oracle里的rowcount,只要update到行,影响的行数就会大于0,而无论update前后字段的值是否发生了变化。

此时查看影响的行数:

select row_count()==〉执行结果为1;

从上面的测试可以得出在MySQL中只有真正对记录进行修改了的情况下,row_count才会去记录影响的行数,否则如果记录存在但是没有实际修改

则不会将该次更新记录到row_count中。

解压MySQL压缩包到硬盘位置,如:C:\MySQL

配置环境变量:

将“C:\MySQL”加入到环境变量Path中

重命名my-default.ini为my.ini

修改my.ini内容:

basedir =C:\MySQL

datadir =D:\MySQL_Data

port =3306

server_id =10

说明:

basedir是程序存放目录

datadir是数据库文件存放目录

port端口号,默认为3306

启动CMD,将工作目录调置到C:\MySQL\bin

安装MySQL为服务,并指定配置文件位置

mysqld -install MySQL --defaults-file="C:\MySQL\my.ini"

对于5.7.12版本来说,如果此时执行net start mysql命令启动服务,则会自动初始化,有可能配置成功,但大多数情况下可能会出现服务无法启动,没关系,使初始化命令进行初始化。

初使化之前请清空D:\MySQL_Data内的文件,执行初使化命令:

mysqld --initialize --user=mysql --console

执行完后CMD控制台上会显示一大堆英文,没关系,大至是说配置文件中缺少一些参数。后期修改my.ini。

启动服务:

net start mysql

服务成功启动。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8471515.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-16
下一篇 2023-04-16

发表评论

登录后才能评论

评论列表(0条)

保存