多行MySQL交换顺序

多行MySQL交换顺序,mysql,swap,Mysql,Swap,我有这张桌子: ID | Name | GroupORDER | 1 | John | 1 | 2 | Ben | 2 | 3 | Joe | 2 | 4 | Paul | 2 | 5 | Anna | 2 | 6 | Tash | 3 | 7 | Ryan | 3

我有这张桌子:

  ID   |  Name  | GroupORDER |
  1    |  John  |    1       |
  2    |   Ben  |    2       |
  3    |   Joe  |    2       |
  4    |  Paul  |    2       |
  5    |  Anna  |    2       |
  6    |  Tash  |    3       |
  7    |  Ryan  |    3       |    
我想用一个查询在两个组之间交换GroupORDER,并得到以下结果:

  ID   |  Name  | GroupORDER |
  1    |  John  |    1       |
  6    |  Tash  |    2       |
  7    |  Ryan  |    2       |  
  2    |   Ben  |    3       |
  3    |   Joe  |    3       |
  4    |  Paul  |    3       |
  5    |  Anna  |    3       |
有什么想法吗? 类似这种完全错误的查询:

 UPDATE table SET GroupORDER = 2 
 WHERE GroupORDER = 3 AND GroupORDER = 3 WHERE GroupORDER = 2;
我正试图通过一个查询实现这一点

这行吗

  • 设置GroupORDER=-1,其中GroupORDER=2

  • 设置GroupORDER=2,其中GroupORDER=3

  • 设置GroupORDER=3,其中GroupORDER=-1


  • 您可以使用
    id
    s指定要更新的行:

    UPDATE table
        SET GroupORDER = 3
        WHERE ID in (4, 5);
    
    或者,如果名称足够:

    UPDATE table
        SET GroupORDER = 3
        WHERE name in ('Paul', 'Anna');
    
    编辑:

    实际上,您可以使用
    limit
    ,做您想做的事情:

    UPDATE table
        SET GroupORDER = 3
        WHERE GroupORDER = 2
        ORDER BY id DESC
        LIMIT 2;
    

    如果您不关心更新哪两行,可以删除
    order by
    子句。

    试试这段代码,我没有测试过,但我认为它可以工作:

    UPDATE table
    SET GroupOrder = 
        CASE 
            WHEN GroupOrder = 2 THEN 3 
            WHEN GroupOrder = 3 THEN 2 
            ELSE GroupOrder 
        END
    WHERE GroupOrder = 2 OR GroupOrder = 3;
    

    这将用“3”替换所有的“2”,这似乎不是问题的目的。这是一种方法,但我更愿意对mySql进行一次查询。这不是问题所在。我想要一个仅使用groupORDER作为参考的解决方案(相同的case语句可以在SELECT中使用,以在不更改数据的情况下给出所需的结果)。