Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

recoger 2 registros diarios aleatoriamente

Estas en el tema de recoger 2 registros diarios aleatoriamente en el foro de Mysql en Foros del Web. Buenos días. necesito almacenar 2 registros escogidos aleatoriamente de una tabla llamada usuario, y que se almacene en una tabla llamada ganadores. Quiero que esto ...
  #1 (permalink)  
Antiguo 14/02/2014, 05:05
 
Fecha de Ingreso: diciembre-2007
Mensajes: 79
Antigüedad: 16 años, 4 meses
Puntos: 0
recoger 2 registros diarios aleatoriamente

Buenos días.

necesito almacenar 2 registros escogidos aleatoriamente de una tabla llamada usuario, y que se almacene en una tabla llamada ganadores.

Quiero que esto se haga automáticamente 1 vez al día.

Es posible?
  #2 (permalink)  
Antiguo 14/02/2014, 05:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: recoger 2 registros diarios aleatoriamente

Cita:
Quiero que esto se haga automáticamente 1 vez al día.
Para el proceso automático, debes usar EVENT.
En el SELECT deberás usar RAND() y LIMIT.

Fuera de eso, postea qué intentaste...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 14/02/2014, 05:22
 
Fecha de Ingreso: diciembre-2007
Mensajes: 79
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: recoger 2 registros diarios aleatoriamente

Voy a informarme a cerca del EVENT.

Muchas gracias.

Luego os cuento
  #4 (permalink)  
Antiguo 14/02/2014, 07:30
 
Fecha de Ingreso: diciembre-2007
Mensajes: 79
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: recoger 2 registros diarios aleatoriamente

Buenas tardes. He estado haciendo unas pruebas con el event y por fin lo he echo funcionar, pero ahora tengo un problemilla que no se subsanar.

Código SQL:
Ver original
  1. CREATE EVENT UsuarioAleatorio
  2. ON SCHEDULE EVERY 1 MINUTE
  3. DO
  4.  
  5. INSERT INTO aleatorio (USER)  SELECT nombre FROM usuarios ORDER BY rand() LIMIT 1;
  6. INSERT INTO aleatorio (USER)  SELECT nombre FROM usuarios ORDER BY rand() LIMIT 1;

El problema que tengo es que con esta sentencia podría darse el caso de que los dos usuarios resultantes del random fuesen el mismo.

Me podéis ayudar a solucionarlo?
  #5 (permalink)  
Antiguo 14/02/2014, 08:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: recoger 2 registros diarios aleatoriamente

Cita:
El problema que tengo es que con esta sentencia podría darse el caso de que los dos usuarios resultantes del random fuesen el mismo.
Código MySQL:
Ver original
  1. INSERT INTO aleatorio (USER)  SELECT nombre FROM usuarios ORDER BY rand() LIMIT 2;

Ahora ya no

Cita:
Quiero que esto se haga automáticamente 1 vez al día.
????

Cita:
EVERY 1 MINUTE
!!!!!

(nombre es la PK?)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #6 (permalink)  
Antiguo 14/02/2014, 08:30
 
Fecha de Ingreso: diciembre-2007
Mensajes: 79
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: recoger 2 registros diarios aleatoriamente

Si le pongo limit 2 solo me guarda el primer registro.

Lo del every 1 minute lo tengo para no tener que esperar 1 día para ver los cambios....
  #7 (permalink)  
Antiguo 14/02/2014, 08:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: recoger 2 registros diarios aleatoriamente

Primero, no uses palabras reservadas de MySQL para nombres de tablas o campos. Los resultados pueden ser impredecibles. USER es una de ellas.
Segundo, si la query devuelve dos registros, no es posible que se esté guardando uno sólo... Algo hay erróneo, y yo pensaría en lo que dice quimfv: ¿cuál es la PK de la tabla "aleatorio"?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 14/02/2014, 09:02
 
Fecha de Ingreso: diciembre-2007
Mensajes: 79
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: recoger 2 registros diarios aleatoriamente

Buenas de nuevo.

Ya guarda bien los dos registros.

voy a dejarlo activado un rato a ver si se repiten los registros. doy por echo que deberia ser imposible porque si los esta ordenando aleatoriamente....

Muchas gracias por vuestra ayuda
  #9 (permalink)  
Antiguo 14/02/2014, 09:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: recoger 2 registros diarios aleatoriamente

Cita:
doy por echo que deberia ser imposible porque si los esta ordenando aleatoriamente....


Depende...

SI ese campo es PK de la tabla "aleatorio", y la tabla "usuarios" tiene un numero finito de registros, la cantidad de inserciones irá reduciéndose hasta el punto de detenerse, por simple cuestión estadística.
Si por otro lado, hicieras una rutina para verificar que no exista antes de insertarlo, el tiempo se extenderá hasta el infinito.
La explicación de por qué es algo larga.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 14/02/2014, 09:13
 
Fecha de Ingreso: diciembre-2007
Mensajes: 79
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: recoger 2 registros diarios aleatoriamente

efectivamente se me repiten los registros...

y existe alguna manera sencilla de solucionarlo?

la pk son los ids respectivos de cada tabla
  #11 (permalink)  
Antiguo 14/02/2014, 09:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: recoger 2 registros diarios aleatoriamente

Empecemos por el principio: ¿Qué es lo que define a los ganadores? ¿Tiene un ciclo de corte, como por ejemplo, un "sorteo" cada X tiempo?
Si se trata de un sorteo al azar, la repitencia es perfectamente válida. Pero si es una selección que sólo puede ocurrir una vez, entonces tienes que resolverlo por medio de un store procedure, porque deberás hacerlo en más de una sentencia.
Es decir, cada selección deberá al mismo tiempo verificar que no exista previamente, lo que podría resultar de este tipo de consulta:
Código MySQL:
Ver original
  1. INSERT INTO aleatorio (`USER`)  
  2. SELECT nombre
  3. FROM usuarios
  4. WHERE `user`NOT IN (SELECT `user` FROM aleatorio)
El problema es que no puedes consultar la misma tabla que estás escribiendo en la misma sentencia. AL menos no en MySQL.
Por eso necesitarías un SP, que sí puede hacerlo, porque podrías crear una tabla temporal para almacenarlo hasta la inserción.

Algo como
Código MySQL:
Ver original
  1. DELIMITER $$
  2.     CREATE TEMPORARY TABLE usersorteo
  3.     AS
  4.     SELECT nombre
  5.     FROM usuarios
  6.     WHERE `user`NOT IN (SELECT `user` FROM aleatorio)
  7.     ORDER BY rand() LIMIT 2;
  8.  
  9.     INSERT INTO aleatorio
  10.     SELECT *
  11.     FROM usersorteo;
  12. END$$
  13.  
  14. DELIMITER ;

Como la tabla "usersorteo" se borra automáticamente cada vez que el SP se termina de ejecutar, no se repetirían jamás los nombres.

Además de esto, te sugiero que generes un indice UNIQUE sobre el campo "user" de la tabla aleatorios.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 17/02/2014, 05:45
 
Fecha de Ingreso: diciembre-2007
Mensajes: 79
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: recoger 2 registros diarios aleatoriamente

La cosa es que cada dia se van a seleccionar dos usuarios de entre todos los registrados en la web. en realidad no ganan nada, solo se mostraran en pantalla esos 2 usuarios, y lógicamente no pueden ser el mismo ya que no quedaría demasiado bien.

esta ultima sentencia va al final del evento?
  #13 (permalink)  
Antiguo 17/02/2014, 05:54
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: recoger 2 registros diarios aleatoriamente

Código SQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE sorteo
  3. BEGIN
  4.     CREATE TEMPORARY TABLE usersorteo
  5.     AS
  6.     SELECT nombre
  7.     FROM usuarios
  8.     WHERE `user`NOT IN (SELECT `user` FROM aleatorio)
  9.     ORDER BY rand() LIMIT 2;
  10.  
  11.     INSERT INTO aleatorio
  12.     SELECT *
  13.     FROM usersorteo;
  14.  
  15.     SELECT *
  16.     FROM usersorteo;
  17. END$$
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 17/02/2014, 06:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: recoger 2 registros diarios aleatoriamente

Si un usuario es elegido una vez ya no podrá ser elegido una segunda vez?

Si es así @gnzsoloyo ya te dio la solución, ahora bien llegará un momento en que no podrás elegir nuevos usuarios, o solo se elegirá entre los que se hayan dado de alta des de el último "sorteo"... si solo se han dado de alta 2 saldran esos 2. Seria como elegir usuarios sin retornarlos al conjunto inicial.

Por otro lado no confundas elegir aleatoriamente elementos de un conjuto con el hecho de que no se te repitan... Si un elemento de un conjunto es elegido aleatoriamente el dia 1 al dia siguiente tiene exactamente las mismas posibilidades de ser elegido que cualquier otro elemento del conjunto, puesto que los eventos son independientes. En este caso seria elegir usuarios retornandolos al conjunto inicial.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #15 (permalink)  
Antiguo 17/02/2014, 06:04
 
Fecha de Ingreso: diciembre-2007
Mensajes: 79
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: recoger 2 registros diarios aleatoriamente

creo el sp en vez del evento?

pero entonces como hago que se cargue 1 vez al dia?

Siento mi ignorancia. Gracias por tu tiempo
  #16 (permalink)  
Antiguo 17/02/2014, 06:06
 
Fecha de Ingreso: diciembre-2007
Mensajes: 79
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: recoger 2 registros diarios aleatoriamente

Si, no me preocupa que se repita al dia siguiente. el problema le tengo en que en ocasiones los usuarios elegidos el mismo día, son el mismo usuario.

Pero tienen que entrar todos en el sorteo todos los dias.
  #17 (permalink)  
Antiguo 17/02/2014, 06:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: recoger 2 registros diarios aleatoriamente

Código MySQL:
Ver original
  1. SELECT nombre
  2.     FROM usuarios
  3.     ORDER BY rand() LIMIT 2;

Esto siempre te dará dos usuarios distintos. Siempre que "nombre" sea único, por esto te preguntaba si era PK.

Usuarios
id Nombre

1 Juan
2 Juan
3 María

(si en este caso sale dos veces Juan seguro que estará dando el usuario 1 y el usuario 2)

Encambio

Código MySQL:
Ver original
  1. SELECT nombre
  2.     FROM usuarios
  3.     ORDER BY rand() LIMIT 1;
  4. SELECT nombre
  5.     FROM usuarios
  6.     ORDER BY rand() LIMIT 1;

puede dar dos veces el mismo usuario.

Usuarios
id Nombre

1 Juan
2 Juan
3 María
(si en este caso sale dos veces Juan puede que salga dos veces el usuario 1, dos veces el 2 o el 1 y el 2)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 17/02/2014 a las 06:19
  #18 (permalink)  
Antiguo 17/02/2014, 06:16
 
Fecha de Ingreso: diciembre-2007
Mensajes: 79
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: recoger 2 registros diarios aleatoriamente

volvere a probar pero no se porque
Código MySQL:
Ver original
  1. SELECT nombre
  2.     FROM usuarios
  3.     ORDER BY rand() LIMIT 2;

me daba 2 registros iguales. por eso no entendía nada.

Un saludo
  #19 (permalink)  
Antiguo 17/02/2014, 06:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: recoger 2 registros diarios aleatoriamente

Cita:
Iniciado por akrogonac Ver Mensaje
creo el sp en vez del evento?

pero entonces como hago que se cargue 1 vez al dia?

Siento mi ignorancia. Gracias por tu tiempo
No exactamente. En el EVENT llamas al SP.

En cuanto al tema de la repitencia, ¿cuál es exactamente el problema de que se repita dos veces el mismo usuario?
Si el tema es que no se repita dos días seguidos, simplemente mantienes un registro de los que se seleccionaron, junto con la fecha de selección y lo pones como parte del filtro.
Es decir, que no sólo filtre por nombre, sino que además lo haga descartando aquellos que hayan sido seleccionados en los X días anteriores al presente.
Algo como:

Código SQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE sorteo
  3. BEGIN
  4.     CREATE TEMPORARY TABLE usersorteo
  5.     AS
  6.     SELECT nombre, CURDATE() fechaPub
  7.     FROM usuarios
  8.     WHERE `user`NOT IN (SELECT `user` FROM aleatorio WHERE fechaPub >= DATE_SUB(CURDATE, INTERVAL 7 DAY))
  9.     ORDER BY rand() LIMIT 2;
  10.  
  11.     INSERT INTO aleatorio(`user`, fechaPub
  12.     SELECT *
  13.     FROM usersorteo;
  14.  
  15.     SELECT *
  16.     FROM usersorteo;
  17. END$$
Eso haría que se repitan aquellos que se publicaron hace más de una semana.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #20 (permalink)  
Antiguo 17/02/2014, 06:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: recoger 2 registros diarios aleatoriamente

Cita:
Iniciado por akrogonac Ver Mensaje
Si, no me preocupa que se repita al dia siguiente. el problema le tengo en que en ocasiones los usuarios elegidos el mismo día, son el mismo usuario.

Pero tienen que entrar todos en el sorteo todos los dias.
Parece que el problema es elegir dos veces al mismo el mismo dia,.... no en dias sucesivos, entiendo que con ORDER BY rand() LIMIT 2 debe quedar resuelto.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Etiquetas: aleatoriamente, recoger, registro, registros, tabla
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 14:41.