2011-03-05 26 views
22

Estoy tratando de agregar filas a una columna, manteniendo el order de la última columna establecida en uno, y todas las demás filas contando desde allí.Actualizar/Incrementar una sola columna en varias filas a la vez

En este caso, agrego una nueva fila con order = 0, luego uso esta consulta para actualizar todas las filas en una.

"UPDATE favorits SET order = order+1" 

Sin embargo, lo que ocurre es que todas las filas se actualizan con el mismo valor. Obtengo una pila de favoritos, todos con el orden 6, por ejemplo, cuando debería ser uno con 1, el siguiente con 2 y así sucesivamente.

¿Cómo actualizo estas filas de una manera que las ordena de la forma en que deberían ser?

Gracias,
~ Jordan

+0

Su consulta se ve bien y debería funcionar como se pretende de forma aislada. –

+0

Sunds más extraño. ¿Es esa tu consulta ** exacta ** o tienes una cláusula 'WHERE'? ¿Cómo lo estás ejecutando? Seguramente se debe ejecutar varias veces? ¿Tiene algún disparador sobre la mesa que pueda interferir con las cosas? Además, su consulta definitivamente no es 'UPDATE favorits SET order = @ order + 1' o algo así? –

+0

aumentar al revés? simplemente tratando de entender ... – Orbit

Respuesta

21

¿Qué le está diciendo a la base de datos para hacerlo actualización cada registro de la tabla mediante el incremento de su campo de orden por uno. Entonces, CADA registro siempre tendrá el mismo valor. Creo que está tratando de establecer el último registro en 1 y el registro más antiguo configurado (sin registros + 1).

Así que tal vez usted puede probar esto:

set @count = (SELECT COUNT(ID) from favorits); 
UPDATE favourits SET order = @count-ID+1 

Ahora bien, esto es suponiendo que no hay registros se eliminan. En ese caso, tendría que ajustar para esto y establecer el último registro en 1 y luego incrementar el valor del pedido para cada registro anterior ordenado por ID.

Así que este sería el enfoque:

set @i=0; 
set @Count=(SELECT COUNT(*) from favorits); 

UPDATE favorits SET `order` = @Count-(@i:[email protected]+1)+1; 
0

que tiene intereted, por lo que se le ocurrió la siguiente solución. Considere la siguiente tabla:

CREATE TABLE `placements` (
    `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, 
    `user` varchar(12) NOT NULL, 
    `place` tinyint(3) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO `placements` (`id`, `user`, `place`) VALUES 
(1, 'Adam', 1), 
(2, 'Bill', 2), 
(3, 'Carl', 3), 
(4, 'Doug', 4), 
(5, 'Eddy', 5), 
(6, 'Frank', 6), 
(7, 'George', 7), 
(8, 'Harry', 8), 
(9, 'Ian', 9), 
(10, 'John', 10); 

Por lo tanto, digamos que usted tiene John ir en contra de Adán por el lugar # 1 y John gana:

UPDATE placements 
SET place = place +1 
WHERE user != "John"; 

UPDATE placements 
SET place = 1 
WHERE user = "John"; 

John está ahora en primer lugar, y todos los demás estaban Bajó una posición. Ahora digamos que George se enfrenta a Carl por la posición de Carl (actualmente la ubicación n. ° 4). George gana: eso significa que George ahora es el lugar # 4, y Carl lugar # 5. ¿Qué le sucede a Georges en la posición anterior de # 8?

UPDATE placements 
SET place = place +1 
WHERE place > 3 
AND place < 9 
AND user != "George"; 

UPDATE placements 
SET place = 4 
WHERE user = "George"; 

Por lo tanto, realmente no es tan difícil de hacer. Solo debe conocer la ubicación actual de algunos de sus usuarios y ajustar sus consultas MySQL según sea necesario.

Si pega estas consultas en su terminal o phpMyAdmin (o lo que sea que use) y sigue, verá que funciona.

Cuestiones relacionadas