MySQL案例什么时候不行

时间:2012-06-12 13:45:52

标签: mysql sql list if-statement

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

  1. ITEM1
  2. ITEM2
  3. 项目3
  4. ITEM4
  5. ITEM5
  6. 将item5移动到位置2会将列表更新为:

    1. ITEM1
    2. item5<< 新职位
    3. item2<< [向下移动一个]
    4. item3<< [向下移动一个]
    5. item4<< [向下移动一个]
    6. 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; =交换(这将随后在列表向上或向下移动位置时进行更新

2 个答案:

答案 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)。

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

答案 1 :(得分:0)

如果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 ;