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;

04fdc88185fd7d0357d66a02425e6930.png

分析问题是我们如何使用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;

9d3553a292ac0329d347285c420c4ac1.png

上面的语句功能还有一个性能上的问题,经过测试改为以下:

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;

843839738bdd90a0e86996eee35d63c3.png

创建重复数据表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;

de7f01298bfe1d3b6dae726c3216242e.png

看一下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;

9cbd86feb0d7ea805db260cfab174b6f.png

3、总结问题:

行号的数据问题,其实在mysql开发实践中经常会遇到,我们做俩步分析问题,不重数的数据我们采用子查询自连求数,如果是重复的数据,我们采用数据辅助表和子查询自连求之。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值