Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

actualizar con datos aleatorios

Estas en el tema de actualizar con datos aleatorios en el foro de Mysql en Foros del Web. hola gente, tengo una tabla gallery con 300.000 datos con estas columnas id product_id path order por cada product_id hay 4 registros y todos con ...
  #1 (permalink)  
Antiguo 08/11/2012, 13:43
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 20 años
Puntos: 43
actualizar con datos aleatorios

hola gente,
tengo una tabla gallery con 300.000 datos con estas columnas
id
product_id
path
order

por cada product_id hay 4 registros y todos con order 0.
Lo que necesito hacer es actualizar el campo order con un valor aleatorio entre 0 y 4 "que no se repita" para todos los registros de un product_id para esos 300.000.
Yo intente usar floor(rand()*4) pero siempre me repetia al menos una vez el valor cero.
Hay forma de hacer lo que estoy buscando?
Saludos
  #2 (permalink)  
Antiguo 08/11/2012, 15:49
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: actualizar con datos aleatorios

Hola destor77:

Para lo que quieres hacer, en realidad no te sirve la RAND(), pues en realidad nada te impide que se repitan 4 veces el mismo número... lo que podrías hacer en todo caso es ordenar tus registros de manera aleatoria y después enumerarlos... es un enfoque muy distinto pero así no habría manera de que se repitiera ningún número:

Para no tardarme tanto tiempo en la explicación, te voy a pedir que por favor leas estas ligas, PERO EN SERIO, LEELAS... ahí se muestran muchas consultas sencillas, pero no tan fáciles de aprender que te ayudarán ha hacer cosas que difícilmente podrías lograr por tu cuenta

http://www.artfulsoftware.com/infotree/queries.php#104
http://stackoverflow.com/questions/1...umber-in-mysql

La idea que se me ocurre sería la siguiente... imagina que tienes estos registros:

Código MySQL:
Ver original
  1. mysql> select id, descripcion from tabla1;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | a           |
  6. |    1 | b           |
  7. |    1 | c           |
  8. |    1 | d           |
  9. |    1 | e           |
  10. |    2 | a           |
  11. |    2 | b           |
  12. |    2 | c           |
  13. |    2 | d           |
  14. |    2 | e           |
  15. +------+-------------+
  16. 10 rows in set (0.00 sec)

observa que para cada id hay 5 registros identificados con las letras a, b, c, d y e.... ahora bien, si entendí qué es lo que pretendes hacer seria presentar esta misma información pero de manera aleatoria, esto podría ser tan sencillo como hacer esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1 ORDER BY ID, RAND();
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | a           |
  6. |    1 | c           |
  7. |    1 | d           |
  8. |    1 | e           |
  9. |    1 | b           |
  10. |    2 | e           |
  11. |    2 | b           |
  12. |    2 | d           |
  13. |    2 | a           |
  14. |    2 | c           |
  15. +------+-------------+
  16. 10 rows in set (0.01 sec)

Cada que ejecutes esta misma consulta te presentará los registros de una manera distinta...

Ahora bien, si el campo ORDEN es indispensable para ti y ocupas asignar un valor, podrías utilizar la técnica que aparece en la primer liga como Within-group quotas (Top N per group)

sería más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT id, descripcion, rank FROM (
  2.     ->   SELECT ID, descripcion,
  3.     ->          IF( @PREV <> ID, @rownum := 1, @rownum := @rownum+1 ) AS rank,
  4.     ->          @PREV := ID
  5.     ->   FROM (SELECT * FROM tabla1 ORDER BY id, RAND()) tabla1
  6.     ->   JOIN (SELECT @rownum := NULL, @PREV := 0) AS r
  7.     -> ORDER BY ID) T;
  8. +------+-------------+------+
  9. | id   | descripcion | rank |
  10. +------+-------------+------+
  11. |    1 | e           |    1 |
  12. |    1 | b           |    2 |
  13. |    1 | a           |    3 |
  14. |    1 | d           |    4 |
  15. |    1 | c           |    5 |
  16. |    2 | e           |    1 |
  17. |    2 | a           |    2 |
  18. |    2 | c           |    3 |
  19. |    2 | b           |    4 |
  20. |    2 | d           |    5 |
  21. +------+-------------+------+
  22. 10 rows in set (0.00 sec)

Observa que se agregó una columna llamada RANK con los números del 1 al 5, y utilizo un ORDER BY RAND() para ordenar los registros de manera aleatoria.

Código:
...
    ->          @PREV := ID
    ->   FROM (SELECT * FROM tabla1 ORDER BY id, RAND()) tabla1
    ->   JOIN (SELECT @rownum := NULL, @PREV := 0) AS r
...
Esta consulta no es complicada, pero tampoco resulta tan sencilla de explicar, por eso es que te pido que le des una revisada a las ligas que te pose, para que observes cómo funcionan cada una de ellas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 09/11/2012, 06:20
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 20 años
Puntos: 43
Respuesta: actualizar con datos aleatorios

Hola,
muchas gracias, si bien lo que yo quiero es hacer un update de los 300.000 datos que ya tengo cargados, lo que me pasaste creo que me sirve igual para poder hacer un update con una subquery como las que pone.
Abrazo!

Etiquetas: registros, tabla, aleatoria, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:23.