1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 取第N个排序的元素之Mysql存储过程动态SQL order by offset实现案例

取第N个排序的元素之Mysql存储过程动态SQL order by offset实现案例

时间:2023-04-01 19:28:31

相关推荐

取第N个排序的元素之Mysql存储过程动态SQL order by offset实现案例

Mysql 动态取第N个元素

简介

基于mysql实现对某个表的某个字段按照顺(逆)序取第N个排序对应的元素,该语句通过存储过程结合预处理实现,也可在程序语言里通过SQL拼接实现。

示例

--1存储过程实现第N个元素的查询DROP PROCEDURE usp_getNth;CREATE PROCEDURE usp_getNth(IN tab VARCHAR(100),IN col VARCHAR(100),IN sort VARCHAR(4),IN seq SMALLINT,OUT num int)BEGINDECLARE dsql VARCHAR(1000);SET @dsql=CONCAT('SELECT ' , col,' FROM ',tab,' ORDER BY ',col,' ',sort,' LIMIT 1 OFFSET ',seq);PREPARE stmt FROM @dsql;EXECUTE stmt;DEALLOCATE PREPARE stmt;END-- 2调用示例SET @num=10;call usp_getNth('emp','sal','DESC',3,@num);SELECT @num;

延展阅读

通过对比我们发现order by limit 1 OFFSET N这里排序时是按照DENSE_RANK的方式进行的,即有重名的视为并列,下个名次延续并列的(排名不出现断层)。

表结构及数据见:

-- Mysql 版本DROP TABLE IF EXISTS emp; DROP TABLE IF EXISTS dept; DROP TABLE IF EXISTS bonus; DROP TABLE IF EXISTS salgrade; create table dept(deptno int unsigned auto_increment COMMENT '部门编号',dname varchar(15) COMMENT '部门名称',loc varchar(50) COMMENT '部门所在位置',primary key(deptno)) COMMENT='部门表';INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');INSERT INTO dept VALUES (30,'SALES','CHICAGO');INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');create table emp(empno int unsigned auto_increment COMMENT '雇员编号',ename varchar(15) COMMENT '雇员姓名',job varchar(10) COMMENT '雇员职位',mgr int unsigned COMMENT '雇员对应的领导的编号',hiredate date COMMENT '雇员的雇佣日期',sal decimal(7,2) COMMENT '雇员的基本工资',comm decimal(7,2) COMMENT '奖金',deptno int unsigned COMMENT '所在部门',primary key(empno),foreign key(deptno) references dept(deptno)) COMMENT='雇员表';INSERT INTO emp VALUES (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);INSERT INTO emp VALUES (7499,'ALLEN','SALESMAN',7698,'1981-2-20',1600,300,30);INSERT INTO emp VALUES (7521,'WARD','SALESMAN',7698,'1981-2-22',1250,500,30);INSERT INTO emp VALUES (7566,'JONES','MANAGER',7839,'1981-4-2',2975,NULL,20);INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,'1981-9-28',1250,1400,30);INSERT INTO emp VALUES (7698,'BLAKE','MANAGER',7839,'1981-5-1',2850,NULL,30);INSERT INTO emp VALUES (7782,'CLARK','MANAGER',7839,'1981-6-9',2450,NULL,10);INSERT INTO emp VALUES (7788,'SCOTT','ANALYST',7566,'87-7-13',3000,NULL,20);INSERT INTO emp VALUES (7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);INSERT INTO emp VALUES (7844,'TURNER','SALESMAN',7698,'1981-9-8',1500,0,30);INSERT INTO emp VALUES (7876,'ADAMS','CLERK',7788,'87-7-13',1100,NULL,20);INSERT INTO emp VALUES (7900,'JAMES','CLERK',7698,'1981-12-3',950,NULL,30);INSERT INTO emp VALUES (7902,'FORD','ANALYST',7566,'1981-12-3',3000,NULL,20);INSERT INTO emp VALUES (7934,'MILLER','CLERK',7782,'1982-1-23',1300,NULL,10);create table salgrade(grade int unsigned COMMENT '工资等级',losal int unsigned COMMENT '此等级的最低工资',hisal int unsigned COMMENT '此等级的最高工资' ) COMMENT='工资等级表';INSERT INTO salgrade VALUES (1,700,1200);INSERT INTO salgrade VALUES (2,1201,1400);INSERT INTO salgrade VALUES (3,1401,2000);INSERT INTO salgrade VALUES (4,2001,3000);INSERT INTO salgrade VALUES (5,3001,9999);create table bonus(ename varchar(10) COMMENT '雇员姓名',job varchar(9) COMMENT '雇员职位',sal decimal(7,2) COMMENT '雇员工资',comm decimal(7,2) COMMENT '雇员资金') COMMENT='奖金表';

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。