我正在尝试在更新单个项目的位置时更新列表中项目的位置,例如:
将item5移动到位置2会将列表更新为:
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位置&lt; {$ position}然后将WHERE子句与现在一样,但是如果位置&gt; {$ position}我想让&lt; =和&gt; =交换(这将随后在列表向上或向下移动位置时进行更新
答案 0 :(得分:2)
我不确定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子句覆盖。接下来,update语句使用SIGN
函数来确定移动是向上移位还是向下移动,从当前位置添加或移除1(除了要移动的行,用新位置更新)< / p>
工作示例
http://sqlfiddle.com/#!2/99c64/1
我必须在架构部分进行更新,因此您无法确切地看到SQL Fiddle中表的更改方式,但是您应该从结果中看到值为“3”的行已移至从位置3开始的位置8,从8到4的所有位置都将其位置向下移动了一个位置。在下面的小提琴中,过程是相反的(第8行移动到3,第3到7向上移动1)。
答案 1 :(得分:0)
如果position
有UNIQUE
约束,由于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 ;