2012-05-07 7 views
6

Lets sagen, dass ich diese Spalten habenmysql-Update eine Spalte mit einer int basiert auf Auftrags

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

Was ich tun möchte, ist Update MoneyOrder und QuantityOrder basierend auf dem Wert von ORDER BY.

So würden die Ergebnisse sein:

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

ich das Update wollen wie eine Identitätsspalte zu betreiben, ohne es tatsächlich zu machen eine Identitätsspalte. Ich weiß, dass ich einfach nach 'x' sortieren könnte und die Reihenfolge wäre das Ergebnis, aber ich möchte einen Bericht erstellen, in dem Sie den Artikel Zeile für Zeile sehen können.

Ist so etwas möglich update mytable set Moneyorder = 'imnotsure' order by MoneyOrder asc?

Antwort

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

oder es in einer einzigen Abfrage zu tun, können Sie

versuchen auf diese Frage
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

für die zweite Abfrage, einen Fehler aus : Inkorrekte Verwendung von UPDATE und ORDER BY – mikewasmike

+0

Ich überarbeitete die Abfrage. Kannst du es versuchen? –

5

Antworten Siehe:

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; 
Verwandte Themen