gpt4 book ai didi

MySQL Case 什么时候不起作用

转载 作者:行者123 更新时间:2023-11-29 06:59:25 24 4
gpt4 key购买 nike

我试图在更新单个项目的位置时更新列表中项目的位置,例如:

  1. 第 1 项
  2. 项目2
  3. 第 3 项
  4. 项目4
  5. 第 5 项

将 item5 移动到位置 2 会将列表更新为:

  1. 第 1 项
  2. item5 <<新位置
  3. item2 << [下移一个]
  4. item3 << [下移一个]
  5. item4 << [下移一个]

.

UPDATE subjects SET  
position = (CASE WHEN position < {$position} THEN position + 1
WHEN position > {$position} THEN position - 1 else position END CASE)
WHERE position <= position AND position >= {$position};

此 SQL 查询不起作用。但是我还想做的是 IF position < {$position} 然后像现在一样使用 WHERE 子句,但是如果 position > {$position} 我想交换 <= 和 >= (这将随后允许在列表中向上或向下移动位置时进行更新

最佳答案

我不确定 WHERE position <= position 的要求是什么是,因为 position永远等于position在同一行...

我也看不出你的更新语句如何只使用一个参数,你肯定需要更新项目的当前位置以及将其移动到的位置?

假设以上是正确的,您可以按如下方式编写查询(使用 2 个参数 $new 表示新职位,$current 表示当前职位):

UPDATE  subjects
SET position = CASE WHEN position = {$current} THEN {$new}
ELSE position + SIGN({$current} - {$new})
END
WHERE position BETWEEN LEAST({$current}, {$new}) AND GREATEST({$current}, {$new})

前提是只有当前值和新值之间的行需要更新,where子句覆盖了。接下来更新语句使用 SIGN确定移动是向上移动还是向下移动的函数,从当前位置添加或删除 1(要移动的行除外,该行已更新为新位置)

工作示例

http://sqlfiddle.com/#!2/99c64/1

我不得不在模式部分进行更新,因此您无法在 SQL Fiddle 中确切地看到表如何更改,但是您应该从结果中看到值为“3”的行已移至从位置 3 到位置 8,从 8 到 4 的所有位置都向下移动了一个。在下面的 fiddle 中,过程相反(第 8 行移动到第 3 行,第 3 行移动到第 7 行,向上移动 1)。

http://sqlfiddle.com/#!2/a087b/1

关于MySQL Case 什么时候不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10998012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com