MySQL 根据行号排序后进行更新

背景

在一个页面上的 外呼包(call_package) 列表数据做排序,数据库表有一个 seq 排序的字段,前端在通过控件拖动,把排完顺序后的外呼包 id 列表发送给后段,后段更新每一个 id 排完的顺序。

实现方式1:n 个 id 就调用执行更新 n 次 sql

实现方式2:id 按照顺序传递给更新语句,执行 1 次 sql(实现方式如下)

MySQL 根据行号排序后进行更新

1、利用 MySQL 的自动生成序列号函数,把序号和id进行一一对应。

2、注意 id 的数据的顺序,order by field(字段, 值1, 值2, 值3,... ) 是为了按照前端传过来的顺序查询,详见 MySQL中 order by 自定义值排序

UPDATE call_package a,
    (SELECT (@i := @i + 1) i, id FROM call_package WHERE id in (162, 114, 158) order by field (id, 162, 114, 158)) i,
    (SELECT @i := 0) ir 
SET a.seq = i.i, update_time=now()
WHERE
	a.id = i.id

Mysql中(@i:=@i+1)的作用

Oracle中有一个伪列rownum,可以在生成查询结果表的时候生成一组递增的序列号。MySQL中没有这个伪列,但是有时候要用,可以用如下方法模拟生成一列自增序号。

@i:=@i+1表示序号依次加1,后面的查询SELECT @i := 0是为了将i进行初始化,每次查询的序列号都会从1开始进行排序生成序列号

完整的SQL语句实例:

SELECT (@i:=@i+1) 序号, name as 所属组织, resource as 单位 FROM cx_external_resources , (SELECT @i:=0) as i

sql示例

select (@i:=@i+5) as rownum, surname, personal_name from student, (select @i:=100) as init;

解释: 上述sql中,后面的值为自定义的初始序号,前面的值为递增规则,上述sql运行结果如下

1.png

当然一般不会这么用,简单的从1开始递增就行

select (@i:=@i+1) as rownum, surname, personal_name from student, (select @i:=0) as init;

2.png

如果是多表联查,跟上述sql类似,连查完后定义一个初始化序列号即可:

select (@i:=@i+1) as rownum, A.surname, B.uname from student A left join user B on CONCAT(A.surname,A.personal_name) = B.uname, (select @i:=0) as init;

3.png


未经允许请勿转载:程序喵 » MySQL 根据行号排序后进行更新

点  赞 (1) 打  赏
分享到: