2012-04-10 23 views
10

Voy a seguir adelante y publicar mi código de MySQL miedo:actualización de MySQL si el valor es mayor que el valor actual

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE uptime = if(302 > uptime, 302, uptime), if(0 > players, 0, players), if(1 > rank, 1, rank) 

Ok, así que vamos a explicar lo que estoy tratando de hacer.

  1. "id" tiene un índice único. Si ese índice aún no existe, quiero insertar esos valores.
  2. Si hay una clave duplicada, en su lugar, deseo ACTUALIZAR cada uno de los 3 campos, solo SI los nuevos valores son mayores que los que están actualmente en la tabla.

Parece que estoy haciendo algo terriblemente malo, y francamente no tengo idea de qué hacer. Traté de hacerlo bien, pero resultó ser un desastre horrible.

Espero que alguien pueda llevarme en la dirección correcta, y me ayude a aprender (y a cualquier otra persona que esté tratando de aprender) a hacer cosas como esta. Gracias.

+1

Así que lo hiciste bien para 'uptime', lo repiten para' players' y 'rank' y debería funcionar – zerkms

+0

Vaya. un momento. Veo de lo que estás hablando, pero no creo que ese sea el problema real. Editar: ¡Dios mío, ese era el problema! Adelante y haz una respuesta. – fruitcup

+0

y cuál es el problema real? No veo ninguno en la pregunta – zerkms

Respuesta

27

Su consulta parece bien, pero que podría mejorarlo para mayor claridad:

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
    VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE 
    uptime = GREATEST(uptime, VALUES(uptime)), 
    players = GREATEST(players, VALUES(players)), 
    rank = GREATEST(rank, VALUES(rank)) 
+2

'GREATEST' y' LEAST' - eso es lo que siempre olvido ;-) +1 – zerkms

+0

o.O Eso es ... increíble. – fruitcup

+0

MÁS GRANDE ... bastante útil – GoldenJoe

4

Puede evitar un poco de duplicación usando la función VALUES. Y otras cosas sólo son buenos en su consulta

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE uptime = if(VALUES(uptime) > uptime, VALUES(uptime), uptime) 
+0

No sé cómo pasé por alto algo así. ¡Qué tipo de error>.> De todos modos, gracias por detectar eso! Probablemente nunca lo hubiera averiguado. Y me hace sentir bien que casi lo hice bien. :) – fruitcup

Cuestiones relacionadas