1

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

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

4

2 回答 2

2

我不确定要求WHERE position <= position是什么,因为position总是position在同一行中相等......

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

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

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

于 2012-06-12T15:15:09.463 回答
0

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

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 ;   
于 2012-06-12T14:39:01.523 回答