mysql 行号_mysql的行号问题
1、行号问题行号是指按顺序为查询结果集的行分配的连续整数。Mysql数据库在行号方面的支持并不是十分友好,没有橡其他数据库一样提供类似的row_number解决方案,因此得到行号是一个十分有技巧的问题。
2.1 不重复数据分析问题先看以下实例数据,创建sales表:
CREATE TABLE sales
(
empid VARCHAR(10) NOT NULL,
mgrid VARCHAR(10) NOT NULL,
qty INT NOT NULL,
PRIMARY KEY (empid)
);
插入实例数据:
INSERT INTO sales VALUES('A','Z',300);
INSERT INTO sales VALUES('B','X',100);
INSERT INTO sales VALUES('C','X',200);
INSERT INTO sales VALUES('D','Y',200);
INSERT INTO sales VALUES('E','Z',250);
INSERT INTO sales VALUES('F','Z',300);
INSERT INTO sales VALUES('G','X',100);
INSERT INTO sales VALUES('H','Y',150);
INSERT INTO sales VALUES('I','X',250);
INSERT INTO sales VALUES('J','Z',100);
INSERT INTO sales VALUES('K','Y',200);
查看sales数据:
select * from sales;
分析问题是我们如何使用SQL语句将empid输出一个行号出来?从1开始?sales表empid是主键不会存在重复的数据,如果不是主键存在重复的数据怎么写SQL:
我是这么分析的过程:
A = A 结果为 true 计数器加1
A < B 结果为 true 计数器加1 结果为2
B < C 结果为 true 计数器加1 结果为3
C < D 结果为 trne 计数器加1 结果为4
依次类推;empid字段自已跟自已关联,如果条件满足小于或等于时,计数据加1,写成以下SQL,
在SQL语句中,称为子查询。
SELECT
empid,
(
SELECT COUNT(*) FROM sales AS t2
WHERE t2.empid <= t1.empid
) AS rownum
FROM sales t1;
上面的语句功能还有一个性能上的问题,经过测试改为以下:
SELECT empid,
(SELECT COUNT(*)
FROM sales AS t2
WHERE t2.qty < t1.qty OR (t2.qty = t1.qty AND t2.empid <= t1.empid)
) AS rownum
FROM
sales AS t1
ORDER BY qty,empid;
2.2 重复数据分析问题
先看以下实例数据,创建数字辅助表nums
CREATE TABLE nums
(
a INT
);
INSERT INTO nums VALUES(1);
INSERT INTO nums VALUES(2);
INSERT INTO nums VALUES(3);
INSERT INTO nums VALUES(4);
INSERT INTO nums VALUES(5);
INSERT INTO nums VALUES(6);
INSERT INTO nums VALUES(7);
INSERT INTO nums VALUES(8);
INSERT INTO nums VALUES(9);
INSERT INTO nums VALUES(10);
select * from nums;
创建重复数据表t;
CREATE TABLE t (a CHAR(1));
INSERT INTO t SELECT 'X';
INSERT INTO t SELECT 'X';
INSERT INTO t SELECT 'X';
INSERT INTO t SELECT 'Y';
INSERT INTO t SELECT 'Y';
INSERT INTO t SELECT 'Z';
select * from t;
看一下t表的数据,X有3条记录,Y有2条记录,Z有1条记录,这个场景下如何解决行号问题?经过分析以后:
SELECT nums.a + smaller AS rownum,
C.a FROM
(
SELECT a,COUNT(*) AS cnt,
( SELECT COUNT(*) FROM t AS B
WHERE B.a < A.a) AS smaller
FROM t AS A
GROUP BY a
)AS C,nums
WHERE nums.a <= cnt;
3、总结问题:
行号的数据问题,其实在mysql开发实践中经常会遇到,我们做俩步分析问题,不重数的数据我们采用子查询自连求数,如果是重复的数据,我们采用数据辅助表和子查询自连求之。
mysql 行号_mysql的行号问题相关推荐
- mysql 分组行号_mysql 显示行号,以及分组排序
建表: CREATE TABLE `my_tb` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_code` varchar(255) DEFAULT ...
- mysql如何使用命令行操作_MySQL命令行基本操作
本文记录的是windows7系统下Mysql的命令行基本操作. 一.MySQL启动与登录 1. MySQL启动: 通过运行mysql安装目录下的/bin/mysqld.exe文件来启动Mysql服务. ...
- mysql排序行号_mysql 取得行号后再排序
一.理论准备 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black tre ...
- mysql 命令行访问_Mysql 命令行模式访问操作mysql数据库操作
使用环境 在cmd模式下输入 mysql --version (查看mysql安装的版本). 完整的命令可以通过mysql --help来获取. 本测试使用的Mysql版本是mysql5, 本测试使用 ...
- mysql命令行语句_MySql命令行命令和SQL语句
一.常用mysql命令行命令 1.启动MYSQL服务 net start mysql 停止MYSQL服务 net stop mysql 2.netstat -na|findstr 3306 查看被监听 ...
- mysql命令参数_MySQL命令行参数完整版
MySQL命令行参数完整版 mysql教程支持下面的选项: ---help,-? 显示帮助消息并退出. --batch,-B 打印结果,使用tab作为列间隔符,每个行占用新的一行.使用该选项,则mys ...
- mysql命令技巧_Mysql命令行技巧汇总
29月/13 1) pager pager真是一个很神奇的东西,它可以控制mysql的输出.默认值是stdout,直接输出. 艾,貌似讲不清楚啊,还是看几个例子吧: mysql> SELECT ...
- mysql 用户命令_MySQL命令行新建用户
https://www.cnblogs.com/penciler/p/4813157.html MySQL命令行能否实现新建用户呢?答案无疑是肯定的.而且在使用使用MySQL命令行新建用户后,还可以为 ...
- mysql批量添加卡号_mysql数据库卡号卡密批量生成写入验证附易辅助模块
SQL = "select * from dianka where kahao='" + 编辑框2.内容 + "' and mima='" + 编辑框3.内容 ...
最新文章
- [Issue Fixed]-repo-error: .repo/manifests/: contains uncommitted changes
- 硕博士的朋友圈都有哪些特点?
- JavaFX技巧13:学习Modena CSS文件
- day30,网络编程和各种协议
- 常见的网站布局方式---左固定右自适应、左右固定中自适应等
- php验证码完整功能,用PHP实现验证码功能
- [转]Linq查询DataTable,DataRow
- Julia: array =tuple, 与 ...
- Perl语言及安装运行环境
- 《通用规范汉字表》背景知识词条
- 2020 IDEA插件无法安装问题
- 做到这五点,才算是好用户体验 -- 转自周鸿祎在UPA用户体验大会上的演讲
- python 求复数的模
- rc时间常数定义_rc电路时间常数的定义及计算
- 二叉树 | 二叉树的镜像(翻转)
- 【嵌入式蓝桥杯】解决LED和LCD引脚冲突的方法
- 如何删除本地/远程Git分支
- Oracle Partner Levels and Diamond Partners List
- uni-app 99群公告推送功能(一)
- linux用户管理(2)----修改用户模式(usermod,sudo权限等)