【问题标题】:MySQL Case When won't workMySQL 案例何时不起作用
【发布时间】:2012-06-15 09:57:49
【问题描述】:

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

  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} 我想让 = 交换(这随后将允许在列表向上或向下移动位置时进行更新

【问题讨论】:

  • 你得到什么错误?
  • 我认为它确实执行了,但是,他对响应不满意。至少,我是这么读的。
  • 数据库查询失败:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'CASE) WHERE position = 1 at line 3 附近使用的正确语法
  • CASE 语句只有END,而不是END CASE。删除最后一个CASE
  • 好的,已经修复了 SQL,谢谢。现在我该怎么做后者,有人知道吗?

标签: mysql sql list if-statement


【解决方案1】:

我不确定WHERE position &lt;= 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”的行已移动到位置 8 从位置 3,并且从 8 到 4 的所有位置都向下移动了 1。在下面的小提琴中,这个过程是相反的(第 8 行移到第 3 行,第 3 行到第 7 行上移 1)。

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

【讨论】:

  • 我看到这个后没有发布我的答案 - 我有同样的想法,但为 SIGN 功能加了 1。如果没有带有给定信息的另一个参数,我也看不到任何方法可以完成给定任务。
【解决方案2】:

如果positionUNIQUE 约束,由于MySQL 的UPDATE 语句的工作方式非标准,您需要2 或3 个步骤:

UPDATE subjects 
  SET position = -67             --- an impossible value
WHERE position = 5 ;

UPDATE subjects 
  SET position = position + 1     
WHERE position BETWEEN 2 AND 5 
ORDER BY position DESC ;   

UPDATE subjects 
  SET position = 2
WHERE position = -67 ;   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多