Ver Mensaje Individual
  #2 (permalink)  
Antiguo 08/11/2012, 15:49
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 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.