2012-05-07 10 views
6

Diciamo che ho queste colonneaggiornamento mysql una colonna con un int in base all'ordine

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

Quello che voglio fare è aggiornare MoneyOrder e QuantityOrder in base al valore di ORDER BY.

Così i risultati sarebbero:

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

voglio l'aggiornamento di operare come una colonna di identità, senza in realtà che lo rende una colonna di identità. So che potrei semplicemente ordinare per "x" e l'ordine sarebbe il risultato, ma voglio generare un rapporto in cui è possibile vedere l'articolo riga per riga.

È possibile qualcosa di simile a questo update mytable set Moneyorder = 'imnotsure' order by MoneyOrder asc?

risposta

29
SET @rownumber = 0;  
update mytable set Moneyorder = (@rownumber:[email protected]+1) 
order by MoneyOrder asc 

o di farlo in una singola query è possibile provare

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 
+0

per la seconda interrogazione, getta un errore : Utilizzo errato di UPDATE e ORDINE BY – mikewasmike

+0

Ho aggiornato la query. Puoi fare un tentativo? –

5

Vedi le risposte a questa domanda:

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; 
Problemi correlati