Ver Mensaje Individual
  #4 (permalink)  
Antiguo 30/01/2014, 13:01
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: Consultas "aleatorias"

Hola Humanista.

En realidad tu consulta no es del todo "aleatorioa"... si entendí correctamente lo que quieres es a partir de un id aleatorio ordenar los registros presentando primeramente todos aquellos cuyo ID sea mayor o igual a ese numero aleatorio y una vez que llegues al último de los id's, listar aquellos registros menores al número aleatorio... ¿es correcto como entiendo el problema?, si es así entonces debes hacerlo por partes:

Para el ejemplo voy a considerar la siguiente tabla:

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

Ahora bien, el procedimiento sería el siguiente:

PRIMER PASO: determinar un número aleatorio entre 1 y el valor máximo de tu tabla, en este caso el número 12... hay varias formas de obtener un aleatorio entre un rango determinado, una de estas sería así:

Código MySQL:
Ver original
  1. mysql> SET @aleatorio = FLOOR(RAND() * 12 + 1);
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT @aleatorio;
  5. +------------+
  6. | @aleatorio |
  7. +------------+
  8. |          5 |
  9. +------------+
  10. 1 row in set (0.00 sec)


SEGUNDO PASO: Ahora, con esta variable @aleatorio, deberías presentar primero los id's del 5 al 12 y después los id's del 1 al 4, esto lo harías con un ORDER BY condicional:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla
  2.     -> ORDER BY IF (id >= @aleatorio, 0, 1), id;
  3. +------+-------------+
  4. | id   | descripcion |
  5. +------+-------------+
  6. |    5 | cinco       |
  7. |    6 | seis        |
  8. |    7 | siete       |
  9. |    8 | ocho        |
  10. |    9 | nueve       |
  11. |   10 | diez        |
  12. |   11 | once        |
  13. |   12 | doce        |
  14. |    1 | uno         |
  15. |    2 | dos         |
  16. |    3 | tres        |
  17. |    4 | cuatro      |
  18. +------+-------------+
  19. 12 rows in set (0.00 sec)

Si vuelves a ejecutar las consultas, obtendrás otro resultado distinto:

Código MySQL:
Ver original
  1. mysql> SET @aleatorio = FLOOR(RAND() * 12 + 1);
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT @aleatorio;
  5. +------------+
  6. | @aleatorio |
  7. +------------+
  8. |         10 |
  9. +------------+
  10. 1 row in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM tabla
  13.     -> ORDER BY IF (id >= @aleatorio, 0, 1), id;
  14. +------+-------------+
  15. | id   | descripcion |
  16. +------+-------------+
  17. |   10 | diez        |
  18. |   11 | once        |
  19. |   12 | doce        |
  20. |    1 | uno         |
  21. |    2 | dos         |
  22. |    3 | tres        |
  23. |    4 | cuatro      |
  24. |    5 | cinco       |
  25. |    6 | seis        |
  26. |    7 | siete       |
  27. |    8 | ocho        |
  28. |    9 | nueve       |
  29. +------+-------------+
  30. 12 rows in set (0.00 sec)

Checa el script para ver si es más o menos lo que necesitas.

Saludos
Leo