【问题标题】:mysql update a column with an int based on ordermysql根据顺序用int更新列
【发布时间】:2012-05-07 16:37:49
【问题描述】:

假设我有这些列

 uniqueID|Money|Quantity|MoneyOrder|QuantityOrder
1|23|12||
2|11|9||
3|99|100||

我要做的是根据ORDER BY 的值更新MoneyOrderQuantityOrder

所以结果是:

uniqueID|Money|Quantity|MoneyOrder|QuantityOrder
1|23|12|2|1
2|11|90|1|2
3|99|100|3|3

我希望更新像标识列一样运行,而不是实际使其成为标识列。我知道我可以按“x”排序,订单就是结果,但我想生成一份报告,您可以在其中逐行查看项目。

这样的事情可能吗update mytable set Moneyorder = 'imnotsure' order by MoneyOrder asc

【问题讨论】:

    标签: mysql sql sql-order-by identity


    【解决方案1】:
    SET @rownumber = 0;    
    update mytable set Moneyorder = (@rownumber:=@rownumber+1)
    order by MoneyOrder asc
    

    或者您可以尝试在单个查询中执行此操作

    update mytable target
    join
    (
         select id, (@rownumber := @rownumber + 1) as rownum
         from mytable         
         cross join (select @rownumber := 0) r
         order by MoneyOrder asc
    ) source on target.id = source.id    
    set Moneyorder = rownum
    

    【讨论】:

    • 对于第二个查询,抛出错误:不正确使用 UPDATE 和 ORDER BY
    • 我对查询进行了更新。可以试试吗?
    【解决方案2】:

    查看此问题的答案:

    Updating column so that it contains the row position

    SET @counter = 0;
    
    UPDATE 
    my_table
    SET MoneyOrder = @counter := @counter + 1
    ORDER BY Money;
    
    SET @counter = 0;
    
    UPDATE 
    my_table
    SET QuantityOrder = @counter := @counter + 1
    ORDER BY Quantity;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-16
      • 2017-11-22
      • 2022-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      相关资源
      最近更新 更多