2012-05-07 5 views
6

Digamos que tengo estas columnasactualización de MySQL una columna con un int basado en el orden

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

Lo que quiero hacer es actualizar MoneyOrder y QuantityOrder basado en el valor de ORDER BY.

Por lo tanto, los resultados serían:

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

quiero la actualización para operar como una columna de identidad sin llegar a lo que es una columna de identidad. Sé que podría simplemente ordenar por 'x' y el orden sería el resultado, pero quiero generar un informe donde pueda ver el artículo línea por línea.

¿Es esto posible update mytable set Moneyorder = 'imnotsure' order by MoneyOrder asc?

Respuesta

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

o hacerlo en una sola consulta puede probar

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

para la segunda consulta, arroja un error : Uso incorrecto de ACTUALIZAR y ORDEN POR – mikewasmike

+0

Actualicé la consulta. ¿Puedes intentarlo? –

5

Véanse las respuestas a esta pregunta:

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; 
Cuestiones relacionadas