MySQL Case语句(if else if的等效语句)

3

我正在尝试根据一个下拉框的提交来更新一个项目的位置,并基于它们在更新后的位置重新排序列表(该下拉框有一个名称分配给PHP变量$position)。以下是一个示例,其中位置由列表中的顺序表示:

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

我正在使用以下MySQL查询:

UPDATE subjects SET 
position = position + 1 
WHERE position <= position AND position >= {$position};

如果我把Item5移动到位置2,这个查询将会把从位置2到4的所有东西向下推一个位置,结果如下:
1. Item1 2. Item5 <<< moved up 3. Item2 4. Item3 5. Item4
但是,如果我想要相反的效果,即向下移动一个项目,则需要将位置减少一(position = position - 1),并且<=和>=符号会交换位置。因此,我想知道如何在case语句中做到这一点(相当于if{} else if{})。
2个回答

4
如果你需要if else语句,可以使用MySQL的case语句(链接)。它的基本工作原理如下:
CASE case_value
  WHEN when_value THEN statement_list
  [WHEN when_value THEN statement_list] ...
  [ELSE statement_list]
END CASE

而且您可以根据需要嵌套它们。


0

请尝试一下

update subjects set position=(CASE
    WHEN search_condition THEN 
        position+1
    WHEN search_condition THEN 
    postion-1
    else
       postion
END CASE) WHERE position <= position AND position >= {$position} AND menu_type = '{$menu_type}'";

“search_condition” 是什么意思?谢谢。 - Justin
不需要讽刺。尚未完全明确其应采用何种格式。我假设它将是:"position < $position" 然后 "position > $position"。 - Justin
以下查询会出现错误: $query = "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} AND menu_type = '{$menu_type}'";
- Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接