2011-02-11 13 views
7

¿Es posible ordenar una lista y guardar la orden en una sola actualización?MySQL - Guardar orden de la lista con una sola actualización

he intentado de esta manera:

UPDATE `jos_vm_category`,(SELECT @row:=0) AS init SET @row:[email protected]+1, [email protected] ORDER BY `category_name` ASC 

pero tiene un error:

1221 - Incorrect usage of UPDATE and ORDER BY

Si no está claro, necesito esto:

category_id | category_name | list_order 
    3  |  A  |  1 
    1  |  B  |  2 
    2  |  C  |  3 

de esto:

category_id | category_name | list_order 
    1  |  B  |  1 
    2  |  C  |  2 
    3  |  A  |  3 

con una sola ACTUALIZACIÓN.

Así que list_order es un campo de la tabla donde tengo que guardar el orden de las filas. (Ya tengo la solución, pero tienen que esperar 2 días, así que voy a publicar a continuación, si nadie responde a la pregunta.)

Respuesta

9

MySql no permite un ORDER BY con una actualización de tabla múltiple. Docs

Puede utilizar una consulta sub lugar:

UPDATE jos_vm_category c 
    JOIN (
     SELECT category_id, (@row:[email protected]+1) rowNum 
     FROM jos_vm_category, (SELECT @row:=0) dm 
     ORDER BY category_name 
    ) rs ON c.category_id = rs.category_id 
SET c.list_order = rs.rowNum 

Alternativamente, se puede dividir en 2 consultas:

SELECT @row:=0; 
UPDATE jos_vm_category 
SET list_order = (@row:[email protected]+1) 
ORDER BY category_name; 
+2

Sé que esto es antiguo, pero la instrucción UPDATE que ha publicado es la declaración de SQL más grande que se haya publicado. Era exactamente lo que había estado buscando durante medio año para encontrar. ¡Gracias! – woolyninja

0

Creo que esto es lo que busca:

ALTER TABLE `jos_vm_category` ORDER BY `category_name`; 
+0

En realidad no, necesito los números de fila de la lista ordenada. – inf3rno

+0

Existe la función SQL incorporada 'ROW_NUMBER()'. ¿Es eso lo que estás buscando en lugar de '@ row'? [http://www.openwinforms.com/row_number_to_sql_select.html](http://www.openwinforms.com/row_number_to_sql_select.html) – Eli

+0

MySQL no admite funciones de ventana, por lo que row_number() no se puede usar –

Cuestiones relacionadas