背景
在一个页面上的 外呼包(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开始递增就行
select (@i:=@i+1) as rownum, surname, personal_name from student, (select @i:=0) as init;
如果是多表联查,跟上述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;
未经允许请勿转载:程序喵 » MySQL 根据行号排序后进行更新