Ver Mensaje Individual
  #4 (permalink)  
Antiguo 05/09/2013, 14:04
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Rand con ProbabilidadesDefinidas

Hola dezagus:

en realidad no hay un camino para hacer lo que quieres, pero se me ocurre por ejemplo que tú hagas una clasificación de los registros que quieres que aparezcan más... por ejemplo, si tienes 10 registros así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+-------------+-----------+
  3. | id   | descripcion | prioridad |
  4. +------+-------------+-----------+
  5. |    1 | uno         |         1 |
  6. |    2 | dos         |         1 |
  7. |    3 | tres        |         1 |
  8. |    4 | cuatro      |         1 |
  9. |    5 | cinco       |         1 |
  10. |    6 | seis        |         1 |
  11. |    7 | siete       |         1 |
  12. |    8 | ocho        |         2 |
  13. |    9 | nueve       |         2 |
  14. |   10 | diez        |         2 |
  15. +------+-------------+-----------+
  16. 10 rows in set (0.00 sec)

es decir, te interesa que los registros marcados con prioridad 1 aparezcan más frecuentemente que los de prioridad 2, pero que el orden siga siendo aleatorio. Si quieres obtener tres registros por ejemplo, y te interesa que dos de ellos sean prioridad 1 y uno de ellos prioridad 2, no puedes hacer un simple ORDER BY RAND(), pues puede pasar esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla ORDER BY RAND() LIMIT 3;
  2. +------+-------------+-----------+
  3. | id   | descripcion | prioridad |
  4. +------+-------------+-----------+
  5. |    8 | ocho        |         2 |
  6. |    7 | siete       |         1 |
  7. |    9 | nueve       |         2 |
  8. +------+-------------+-----------+
  9. 3 rows in set (0.00 sec)

es decir, aquí aparecen tres registros al azar, pero dos de ellos tienen prioridad 2, sin embargo, puedes hacer uso de UNION's para diferenciar por las distintas prioridades, así:

Código MySQL:
Ver original
  1. mysql> (SELECT * FROM tabla WHERE prioridad = 1 ORDER BY RAND() LIMIT 2)
  2.     -> UNION
  3.     -> (SELECT * FROM tabla WHERE prioridad = 2 ORDER BY RAND() LIMIT 1);
  4. +------+-------------+-----------+
  5. | id   | descripcion | prioridad |
  6. +------+-------------+-----------+
  7. |    1 | uno         |         1 |
  8. |    4 | cuatro      |         1 |
  9. |    9 | nueve       |         2 |
  10. +------+-------------+-----------+
  11. 3 rows in set (0.00 sec)

De esta manera SIEMPRE OBTIENES DOS REGISTROS CON PRIORIDAD 1 y un registro con prioridad 2, pero el orden de los registros está dado por el azar.

Dale un vistazo para ver si te sirve esto.

Saludos
Leo.