mysql - MySQL 5.0 根据不同的列分配编号
问题描述
我一直在试图弄清楚如何分配数字(在我的情况下,组号基于不同列中的值)。我有一个带有数字的表格,并根据该数字尝试分配组号。数字是表格的顺序,可以多行相同。
create table test (
code varchar(10) primary key,
num varchar(10) not null,
name varchar(10) not null,
surname varchar(10) not null);
insert into test values (1,9,'Tom', 'Smith');
insert into test values (2,9,'Adam','Blake');
insert into test values (3,15,'John','Smith');
insert into test values (4,15,'Adam','XYZ');
insert into test values (5,43,'John','Abc');
insert into test values (6,99,'Adam','Abc');
insert into test values (7,99,'John','Abc');
所以测试表是这样的:
并且所需的输出看起来像这样,其中 grp 值始终是从 1 开始的连续数字。
结果代码:
create table result (
code varchar(10) primary key,
num varchar(10) not null,
name varchar(10) not null,
surname varchar(10) not null,
grp varchar(10) not null);
insert into result values (1,9,'Tom', 'Smith',1);
insert into result values (2,9,'Adam','Blake',1);
insert into result values (3,15,'John','Smith',2);
insert into result values (4,15,'Adam','XYZ',2);
insert into result values (5,43,'John','Abc',3);
insert into result values (6,99,'Adam','Abc',4);
insert into result values (7,99,'John','Abc',4);
这可以在不创建任何函数和变量的情况下实现吗?是否有任何描述它并且可以使用的伪列?
解决方案
您可以使用相关子查询:
select t.*,
(select count(distinct t2.num)
from test t2
where t2.num <= t.num
) as grp
from test t;
更有效的方法使用变量:
select t.*,
(@grp := if(@n = t.num, @grp,
if(@n := t.num, @grp + 1, @grp + 1)
)
) as grp
from (select t.*
from test t
order by t.num
) t cross join
(select @grp := 0, @n := -1) params;
推荐阅读
- java - MVC 控制器通信
- c - 字符串的typedef char指针分配
- php - POST 请求有时返回代码 302,有时返回代码 200
- datetime - 用均值上采样数据
- cgi - 无法运行 CGI 脚本
- excel - 为文本分配类别
- kubernetes - 如何使用 init 容器检查 MySQL 是否准备好连接?
- python - Discord.py 使用他们的 ID 向用户发送 DM
- flutter - Using same riverpod state provider for multiple pages
- spring - 在没有 @DirtiesContext 的情况下如何在 Quarkus 中实现集成测试?