MYsql在多行的顺序列中更新序列号

MYsql在多行的顺序列中更新序列号,mysql,Mysql,我需要用ID数组的数字序列更新显示顺序列 考虑下面的IDS数组(13, 6, 5、19, 1, 3、2),对于IDS,需要更新订单列 分贝 当前我正在使用以下查询 UPDATE categories SET display_order = CASE id WHEN 13 THEN 1 WHEN 6 THEN 2 WHEN 5 THEN 3

我需要用ID数组的数字序列更新显示顺序列 考虑下面的IDS数组(13, 6, 5、19, 1, 3、2),对于IDS,需要更新订单列

分贝

当前我正在使用以下查询

UPDATE categories
   SET display_order = CASE id 
                      WHEN 13 THEN 1 
                      WHEN 6 THEN 2 
                      WHEN 5 THEN 3 
                      WHEN 19 THEN 4 
                      WHEN 1 THEN 5 
                      WHEN 3 THEN 6 
                      WHEN 2 THEN 7 
                      
                      END
 WHERE id IN (13, 6, 5, 19, 1, 3, 2);

目前,我正在PHP中循环ID以生成“case-when”语句,数组可能会附带更多ID。在Mysql中是否有其他方法可以避免循环。

您应该在单独的表中维护
id
值及其映射
display\u orders

id | val
1  | 5
2  | 7
3  | 6
5  | 3
6  | 2
13 | 1
19 | 4
然后,只需执行更新内部联接:

更新类别c
内部联接显示命令
在d.id=c.id上
设置
显示顺序=d.val
哪里
c、 (1、2、3、5、6、13、19)中的id;
更新类别
设置显示顺序=在集合中查找(id,'13,6,5,19,1,3,2')
其中id在(13,6,5,19,1,3,2)中;
请注意,
FIND_in_SET
中的ids列表是一个字符串,逗号后没有空格<代码>id在搜索前转换为字符串,搜索作为文本搜索执行

如果要将ID列表传输到查询中,可以使用下一个表单:

更新类别
交叉连接(选择'13,6,5,19,1,3,2'ID)ID
SET categories.display_order=在_集中查找(categories.id,ids.id)
其中FIND_在_集中(categories.id,ids.id);

但是,由于文本比较,它会变慢(因此会进行全表扫描-此查询不能使用索引)。仅在压缩(小于1000行)表上执行此操作。

您可以在重复密钥更新时使用insert into

例如:

插入类别(id、显示顺序)
值(13,1),
(6,2),
(5,3),
(19,4),
(1,5),
(3,6),
(2,7) 
关于重复密钥更新
id=值(id),
显示顺序=值(显示顺序);

我正在努力看到单独表格的优势我正在努力不看到单独表格的优势,除非
案例
表达式中的少数值是一次性的,并且永远不会改变。不,您丢失了一些相关信息,例如将
id
映射到其他内容,通常属于表,而不属于查询本身。如果OP想要对所有
id
值进行整体映射,那么我的
WHERE
子句甚至可能是可选的。但是您不只是将CASE查询移动到mappings表吗?通常,仅当关系不是1对1时才需要映射。您通过什么逻辑在前端设置顺序?您还要求我们提供SQL代码来替换前端正在执行的流程,但是你没有告诉我们前端实际上在做什么,所以你的问题无法得到真正的回答。但它没有真正回答问题。在Mysql中有没有其他方法可以避免循环,因为循环仍然用于构建集合字符串?@CaiusJard内爆函数用法不是“循环”。以这种方式使用
FIND_IN_SET
通常表示有代码气味。@Akina我们不知道前端在做什么,但我们可以假设循环,因为OP说这是他们想要避免的。当然MySQL不会对一个案例进行任何循环,所以。。。我坚持认为OP提出了错误的问题或XY问题;他们决定在SQL中解决一些问题,但解决这些问题可能不是SQL的工作it@CaiusJardOP告诉我们“当前im正在PHP中循环ID以生成”case-when“语句”。据我所知,他有一个数组,$ar[0]=13,$ar[1]=6。。以此类推,他在这个数组上循环,以添加关键字,然后将数组组合成一个字符串插入查询文本。也许我错了。。。我只是展示了提供的查询的另一种形式,它不包含详细的案例。
id | val
1  | 5
2  | 7
3  | 6
5  | 3
6  | 2
13 | 1
19 | 4