在一次查询中更新mysql列表顺序(上移、下移)

在一次查询中更新mysql列表顺序(上移、下移),mysql,Mysql,如果我只知道一个id,有没有办法在一个查询中上移/下移列表项 像这样的 update tbl SET list_order = CASE WHEN id = 10 THEN (SELECT list_order FROM tbl WHERE list_order > (SELECT list_order FROM tbl WHERE id = 10) ORDER BY list_

如果我只知道一个id,有没有办法在一个查询中上移/下移列表项

像这样的

update tbl 
   SET list_order = 
    CASE 
     WHEN id = 10  
        THEN (SELECT list_order FROM tbl 
               WHERE list_order > (SELECT list_order FROM tbl WHERE id = 10)
               ORDER BY list_order ASC LIMIT 1)
     WHEN id = (SELECT id FROM tbl 
                 WHERE list_order > (SELECT list_order FROM tbl WHERE id = 10) 
                 ORDER BY list_order ASC LIMIT 1)
        THEN (SELECT list_order FROM tbl WHERE id = 10) 
     ELSE list_order
    END
tbl

至>

我对这个问题示例的答案在ID为10的列表行中上移

    UPDATE tbl e
     JOIN (SELECT id, list_order FROM tbl 
          WHERE list_order < (SELECT list_order FROM tbl WHERE id = 10)
                 ORDER BY list_order DESC LIMIT 1) t1
     JOIN (SELECT list_order FROM tbl WHERE id = 10) t2
     SET e.list_order = CASE 
      WHEN e.id = 10  
        THEN t1.list_order 
      WHEN e.id = t1.id
        THEN t2.list_order 
      ELSE e.list_order
     END 

如果将id 22向上移动一个-

UPDATE tbl t1
INNER JOIN tbl t2
    ON t1.list_order - 1 = t2.listorder
SET
    t1.list_order = t1.list_order - 1,
    t2.list_order = t2.list_order + 1
WHERE t1.id = 22;

如果将id 22向上移动一个-

UPDATE tbl t1
INNER JOIN tbl t2
    ON t1.list_order - 1 = t2.listorder
SET
    t1.list_order = t1.list_order - 1,
    t2.list_order = t2.list_order + 1
WHERE t1.id = 22;

不清楚。你到底想做什么,请给出一个可能重复的例子。你到底想做什么,请举一个可能重复的例子。。仅当您具有正确的列表顺序1、2、3时,此选项才有效。如果您删除列表顺序为2的行,这将不再有效,这是我的意图。如果这是唯一用于修改列表顺序的代码,那么这无关紧要。还有什么代码修改列表顺序?为什么列表最终会有漏洞?删除位置2中的项目时,应从所有位置大于2的条目中减去1。类似地,如果在位置3处插入,则应在位置>=3的所有条目中添加1。足够公平。我给出了一个最简单的查询,它基于维护列表顺序的连续集。我喜欢让这些东西保持连续,但这是不必要的,只是我喜欢做的事。。仅当您具有正确的列表顺序1、2、3时,此选项才有效。如果您删除列表顺序为2的行,这将不再有效,这是我的意图。如果这是唯一用于修改列表顺序的代码,那么这无关紧要。还有什么代码修改列表顺序?为什么列表最终会有漏洞?删除位置2中的项目时,应从所有位置大于2的条目中减去1。类似地,如果在位置3处插入,则应在位置>=3的所有条目中添加1。足够公平。我给出了一个最简单的查询,它基于维护列表顺序的连续集。我喜欢让这些事情保持连续,但这是不必要的,只是我喜欢做的事情。
UPDATE tbl t1
INNER JOIN tbl t2
    ON t1.list_order - 1 = t2.listorder
SET
    t1.list_order = t1.list_order - 1,
    t2.list_order = t2.list_order + 1
WHERE t1.id = 22;