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+------+-------------+
| id | descripcion |
+------+-------------+
| 1 | a |
| 1 | b |
| 1 | c |
| 1 | d |
| 1 | e |
| 2 | a |
| 2 | b |
| 2 | c |
| 2 | d |
| 2 | e |
+------+-------------+
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+------+-------------+
| id | descripcion |
+------+-------------+
| 1 | a |
| 1 | c |
| 1 | d |
| 1 | e |
| 1 | b |
| 2 | e |
| 2 | b |
| 2 | d |
| 2 | a |
| 2 | c |
+------+-------------+
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 -> IF( @
PREV <> ID
, @rownum
:= 1, @rownum
:= @rownum
+1 ) AS rank
, +------+-------------+------+
| id | descripcion | rank |
+------+-------------+------+
| 1 | e | 1 |
| 1 | b | 2 |
| 1 | a | 3 |
| 1 | d | 4 |
| 1 | c | 5 |
| 2 | e | 1 |
| 2 | a | 2 |
| 2 | c | 3 |
| 2 | b | 4 |
| 2 | d | 5 |
+------+-------------+------+
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.