Foros del Web » Programando para Internet » PHP »

Ir registro por registro de forma aleatoria.

Estas en el tema de Ir registro por registro de forma aleatoria. en el foro de PHP en Foros del Web. Como les va gente, les cuento quiero mostrar en una pagina un registro aleatorio, y que con un vinculo (siguiente) , el usuario pueda pasar ...
  #1 (permalink)  
Antiguo 22/08/2006, 13:56
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 13 años
Puntos: 1
Ir registro por registro de forma aleatoria.

Como les va gente, les cuento quiero mostrar en una pagina un registro aleatorio, y que con un vinculo (siguiente) , el usuario pueda pasar al proximo.

Si bien la consulta sql la conosco:

Código:
$data = mysql_query("SELECT * FROM usuarios ORDER BY RAND() LIMIT 1") or die(mysql_error());
Lo que no se como realizar es que no repita el registro que ya mostro, y de que forma hago pasar al siguiente.

Saludos.!
  #2 (permalink)  
Antiguo 22/08/2006, 14:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si no quieres repetir registros, tendrás que ir almacenandote en algún otro sitio; lease: session? .. otra tabla de tu BBDD (temporal)? .. esos ID's de registros que vas seleccionando aleatóriamente para poder compararlos con los que vas generando nuevamente y si se repite .. forzar generar uno aleatório.

El tema del siguiente registro lo puedes solventar con consultas SQL tipo:

Cita:
SELECT * FROM tabla WHERE id > $id_aleatorio_obtenido LIMIT 1
(Selecciono al ID (aprovechando que es auto-numérico) mayor al que obtuve .. y limito los resultados a 1 registro .. pues sólo me interesa el "siguiente" .. no todos los siguientes).


Asumiento que el campo "id" es un campo autonumérico y único que define como único a cada registro de tu tabla ...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 22/08/2006, 14:23
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 15 años, 8 meses
Puntos: 0
Agregando a lo que Cluster acaba de responderte, tambien puedes ir guardando en una session, o cookie los ID's que van pasando y tu consulta podria quedarte como

Código PHP:
                             SELECT FROM tabla WHERE id not in ($id_aleatorio_obtenidoLIMIT 1 
con $id_aleatorio_obtenido = "N,N,N,N,N,N,N";
Por ejemplo:
$id_aleatorio_obtenido = "1,20,35,41,52,97,15,10"

Sugiero esto, por si tenemos 100 registros ordenados por ejemplo del 1 al 100 y en el primer random surge un 50, podras obtener aleatoriamente desde el registro numero 50 al 100 perdiendote de los 49 primeros, de esta forma puedes jugar con todos los registros que tengas, obviando los que ya hayas mostrado.

Saludos
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #4 (permalink)  
Antiguo 22/08/2006, 22:23
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 13 años
Puntos: 1
GRacias, me salio algo asi, el punto es que no funciona, seguramente la variable $id_aleatorio_obtenido deberia ser un array, pero no se como hacerlo dandole la variable de sesion como valor.

Código:
session_name( 'ranking_vistos' );
session_start();
$id_aleatorio_obtenido = $_SESSION["ranking_vistos"];

$data = mysql_query("SELECT * FROM usuarios WHERE id NOT IN ($id_aleatorio_obtenido) ORDER BY RAND() LIMIT 1") or die(mysql_error());


while($ratings = mysql_fetch_array( $data ))
{

//Aca la idea es que no pase por registros que ya vimos..
$_SESSION["ranking_vistos"] = $ratings["id"];
  #5 (permalink)  
Antiguo 22/08/2006, 22:57
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 15 años, 1 mes
Puntos: 4
se me ocurre otra idea, al iniciar, hacer una consulta para saber cuantos registros hay y generar un array de ese tamaño con los puros indices de la tabla.
luego al array aplicare un desorden (la funcion shuffle() me parece) y luego recorrer el arreglo secuencialmente hacia adelante, ya que los valores son los indices que interesan. el arreglo me imagino que se peude guardar en la sesion
  #6 (permalink)  
Antiguo 23/08/2006, 07:43
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por ArrauKano Ver Mensaje
se me ocurre otra idea, al iniciar, hacer una consulta para saber cuantos registros hay y generar un array de ese tamaño con los puros indices de la tabla.
luego al array aplicare un desorden (la funcion shuffle() me parece) y luego recorrer el arreglo secuencialmente hacia adelante, ya que los valores son los indices que interesan. el arreglo me imagino que se peude guardar en la sesion
Será óptimo?

No sé cuantos registros aleatorios necesitará obtener ... pero si el n° de estos es menor al total de registros de la tabla que los proporciona (de la BBDD) creo que es más optimo ir creando un array con los "ID's" obtenidos para mirar si ya se generó que no obtener todos los "ID's" a gestionar y trabajar en un (enorme depende de los datos) array.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 23/08/2006, 10:59
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 15 años, 1 mes
Puntos: 4
si, quizas tengas razón en ese sentido, pero me imaginaba otro caso, supon que ya tienes el 90% de las claves ya vistas, eventualmente puede ocurrir que al generar una clave aleatoria esta ya se halla visto, por lo tanto hay que generar otra, pero ahora ya se han visto casi todas las claves y probablemente si se vuelve a calcular otro número aleatorio vualva a ser un ya visto. Y con esto eventualmente podria darse el caso de que salgan sólo claves ya vistas hasta el infinito, llevando al script a su muerte súbita de los 30 segundos.

Probablemente mi solución no es óptima pero si asegura que el script siempre se comportará como se debe y que no se va a demorar más viendo algunas claves que otras.

Ahora, encontre interesante la idea de una tabla en la base con las claves temporales, pero me imagine el caso que entren varios usuarios a la vez o entre el mismo en algun intervalo de tiempo, asi que en aquella tabla debieran guardarse al menos 2 campos más, uno para identificar al usuario (quizas por la sesion si la pag es publica, o por id si necesitan registrarse) y otro para el timestamp, para poder eliminar de forma segura los datos que se pasen de un intervalo de tiempo, para no llenar la base de basura.

A propósito Cluster, hace poco aprendí que no es correcto decir "más óptimo" ya que decir que algo es "óptimo" implica que no se puede mejorar porque es lo mejor de lo mejor (por así decirlo). Quizás quede mejor "será más veloz?, será menos carga para el servidor?"

salu2
  #8 (permalink)  
Antiguo 23/08/2006, 11:16
Avatar de B**
B**
 
Fecha de Ingreso: enero-2006
Ubicación: Monterrey,Mexico
Mensajes: 952
Antigüedad: 11 años, 10 meses
Puntos: 3
Tambien podria ser que generes un id aleatorio y lo guardes en una tabla.. luego haces un select
Código HTML:
Select distinct ID from tabla;
Y ya con eso le muestras id's q no se repitan...
Como por aca lei.. que las consultas SQL son mas rapidas que codigo PHP...
__________________
-URL= Go PHP5.
-Age=22.
-Learning=PHP,J2EE,Struts,MAMBO,C++,JSON,AJAX,XHTML ,CSS.
  #9 (permalink)  
Antiguo 23/08/2006, 12:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Ahora, encontre interesante la idea de una tabla en la base con las claves temporales, pero me imagine el caso que entren varios usuarios a la vez o entre el mismo en algun intervalo de tiempo, asi que en aquella tabla debieran guardarse al menos 2 campos más, uno para identificar al usuario (quizas por la sesion si la pag es publica, o por id si necesitan registrarse) y otro para el timestamp, para poder eliminar de forma segura los datos que se pasen de un intervalo de tiempo, para no llenar la base de basura.
Si, .. haría falta identificar los datos del usuario que los está usando (valga la rebundancia) .. ya sea usando sesiones y dejando en esas tablas temporales los SID (Idetificador único de sesión) para tal fin .. o incluso dejando esos ID's generados en la própia sesión (así nos olvidamos de los procesos de "garbage" (borrar esos datos temporales bajo criterio de fecha o por otros eventos ..).

Cita:
A propósito Cluster, hace poco aprendí que no es correcto decir "más óptimo" ya que decir que algo es "óptimo" implica que no se puede mejorar porque es lo mejor de lo mejor (por así decirlo). Quizás quede mejor "será más veloz?, será menos carga para el servidor?"
Será así entonces .. realmente no me he puesto a ver el significado de "óptimo". Sólo uso el término en el contexto de lo que mencionas y para englobar ahí todos esas características: consumo de recursos del servidor, tiempo de ejecución .. etc.


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 23/08/2006, 12:51
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por B** Ver Mensaje
Tambien podria ser que generes un id aleatorio y lo guardes en una tabla.. luego haces un select
Código HTML:
Select distinct ID from tabla;
Y ya con eso le muestras id's q no se repitan...
Como por aca lei.. que las consultas SQL son mas rapidas que codigo PHP...
Si, .. en realidad con un uso de SQL "más complejo" de lo que tal vez estemos habituados a usar se debería de poder realizar todo el proceso.

Me refiero a que cualquier motor de BBDD en su SQL dispone de "if()" (condicionales) y estructuras de control en general .. así que perfectamente se -debería- poder implementar en SQL "puro" un proceso como el que comentamos. (Tal vez metido bajo un "Store Procedure" o similar).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #11 (permalink)  
Antiguo 23/08/2006, 13:31
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 13 años
Puntos: 1
Cita:
No sé cuantos registros aleatorios necesitará obtener ... pero si el n° de estos es menor al total de registros de la tabla que los proporciona (de la BBDD) creo que es más optimo ir creando un array con los "ID's" obtenidos para mirar si ya se generó que no obtener todos los "ID's" a gestionar y trabajar en un (enorme depende de los datos) array.

Un saludo,
Me podes guiar mas o menos por favor? ya que recien estoy empesando con php .

De que forma deberia modificar el codigo que explaye mas arriba?

Gracias.
  #12 (permalink)  
Antiguo 23/08/2006, 13:39
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por Snake nS Ver Mensaje
Me podes guiar mas o menos por favor? ya que recien estoy empesando con php .

De que forma deberia modificar el codigo que explaye mas arriba?

Gracias.
(Voy a seguir con mi idea de "guiar" != "hacer el código").

¿Como o donde quieres almacenar esos posibles ID's que vas a ir generando?
La más simple para que entiendas el "concepto" de la propuesta que te hago es usar sesiones.

En ese caso .. tu te manejas con sesiones? .. si no es así ... antes aprende a manejarlas haciendo algunos ejercicios (en las FAQ's tienes) y leyendo su documentación: www.php.net/session .. Así todo lo que posteriormente se te pueda indicar lo entenderás mejor.

¿Que ta te va con "arrays" (arreglos)?
Sabrias ir almacenando en un array los ID's que generes?

Por cierto (y bien importante) . .cuantos ID's necesitas obtener en forma aleatoria del total de registros que tu BBDD pueda obtener ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 23/08/2006, 15:46
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 13 años
Puntos: 1
Como va cluster, los registros se iran incrementando a medida que la cantidad de usuarios aumente, podrian llegar a ser 1000 por decir, quien sabe.

A los ids los quiero almacenar en un array, pero no se de que forma, en cuanto a la cantidad de ids que deseo obtener, tan solo 1, ya que estaria mostrando un registro por pagina.

Muchas gracias.
  #14 (permalink)  
Antiguo 23/08/2006, 16:03
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por Snake nS Ver Mensaje
Como va cluster, los registros se iran incrementando a medida que la cantidad de usuarios aumente, podrian llegar a ser 1000 por decir, quien sabe.

A los ids los quiero almacenar en un array, pero no se de que forma, en cuanto a la cantidad de ids que deseo obtener, tan solo 1, ya que estaria mostrando un registro por pagina.

Muchas gracias.
Ahora .. cual es el problema real de que se repita ese registro? .. con respecto o en base a que criterio? ..

* Que no se repita para el usuario que está en su sesión (si "recarga" la página que obtiene ese ID de registro aleatorio?

* Que no se repita para algún proceso que ese usuario haga a lo largo del tiempo (no de una sesión) ...

* Otra cosa?

Creo que eso es lo primero que tienes que definir .. por qué si dices que vas a gener un sólo registro aleatorio .. no me queda claro el por qué no se puede repetir .. algún criterio tendrás.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #15 (permalink)  
Antiguo 23/08/2006, 16:47
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 13 años
Puntos: 1
Porque el usuario rankea una imagen perteneciente al registro que esta viendo, entonces una ves que el usuario voto pasa al siguiente.

Un estilo www.sexyono.com

Saludos.
  #16 (permalink)  
Antiguo 23/08/2006, 17:06
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por Snake nS Ver Mensaje
Porque el usuario rankea una imagen perteneciente al registro que esta viendo, entonces una ves que el usuario voto pasa al siguiente.

Un estilo www.sexyono.com

Saludos.
Si el usuario está registrado . .entonces lo que vas registrando es que ID's ya votó y el criterio sería "ese usuario".

Si el usuario no está registrado o no requiere registro .. en ese lugar lo más que puedes hacer es limitar esas repeticiones de registros aleatorios por "sesión" ... pero si entra denuevo (saliendo de tu sitio) volverá probablemente a seleccionar un ID que ya votó.

Eso es lo que debes dejar claro ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #17 (permalink)  
Antiguo 23/08/2006, 17:08
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 13 años
Puntos: 1
Cita:
Si el usuario no está registrado o no requiere registro .. en ese lugar lo más que puedes hacer es limitar esas repeticiones de registros aleatorios por "sesión" ... pero si entra denuevo (saliendo de tu sitio) volverá probablemente a seleccionar un ID que ya votó.
Si exactamente esa es mi idea.
  #18 (permalink)  
Antiguo 23/08/2006, 20:06
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Bueno pues entonces .. animo con las sesiones.

Se trata de que crees un array .. metas ahì el ID generado y luego lo dejes en una variable de sesiòn (el array) .. Se trata de comparar si tu ID generado está en tu array y sino, generar otro.

Te puedes ayudar de funciones como:

in_array()

Sobre sesiones:
www.php.net/session

Sobre array's
www.php.net/array

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 21:21.