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

Listado encuesta

Estas en el tema de Listado encuesta en el foro de Mysql en Foros del Web. Hola a todos Tengo la necesidad de generar una consulta para un sistema de encuestas, agradecere su ayuda. Tengo un tabla con los datos de ...
  #1 (permalink)  
Antiguo 29/06/2010, 08:31
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Listado encuesta

Hola a todos

Tengo la necesidad de generar una consulta para un sistema de encuestas, agradecere su ayuda.

Tengo un tabla con los datos de los potenciales encuestados (alrededor de 200 mil), y me piden generar un listado a partir de selecionar a 5 personas por cada comuna (unidad politico administrativa) el tema es que podría hacerlo poniendo en el where una a una las comunas, pero son más de 100.

Alguna idea para armar una consulta que me liste X (ejem 5) registros para cada comuna, en una sola lista?

esta es mi tabla

Código MySQL:
Ver original
  1. CREATE TABLE `datos_2010` (
  2.   `id_registro` INT(6) DEFAULT NULL,
  3.    `rut` VARCHAR(15) DEFAULT NULL,
  4.   `comuna` VARCHAR(50) DEFAULT NULL,
  5.   `localidad` VARCHAR(50) DEFAULT NULL,
  6.   `nombrecliente` VARCHAR(70) DEFAULT NULL,
  7.    `direccion` VARCHAR(100) DEFAULT NULL,
  8.     `telefonocontacto` DECIMAL(12,0) DEFAULT NULL
  9. ) ENGINE=MYISAM DEFAULT CHARSET=utf8
  #2 (permalink)  
Antiguo 29/06/2010, 12:19
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Listado encuesta

No se logré explicar lo que necesito.

Si no se entiende me lo dicen y lo intento de nuevo

Desde ya muchas gracias
  #3 (permalink)  
Antiguo 30/06/2010, 16:00
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Listado encuesta

Señores, no me olviden

Alguien me dé una idea??

Saludos desde el sur del mundo
  #4 (permalink)  
Antiguo 01/07/2010, 08:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Listado encuesta

Chelodelsur,
para eso debes usar programación o un store procedure, creo.
Con una consulta te traes todas las comunas, unas 100, y luego introduces en una iteración consultas para cada comuna (una variable) usando LIMIT 5 en esa segunda consulta. En realidad lanzas una consulta por cada comuna. No sé si necesitas que la selección sea aleatoria o con algún criterio, y tampoco cómo vas a usar luego los datos. Tal vez necesites cargarlos en un array, pero dinos qué vas a hacer luego con ellos.
  #5 (permalink)  
Antiguo 01/07/2010, 08:41
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: Listado encuesta

Podemos intentar algo con las variables de usuario:
Código MySQL:
Ver original
  1.   id_registro,
  2.   rut,
  3.   comuna,
  4.   localidad,
  5.   nombrecliente,
  6.   direccion,
  7.   telefonocontacto
  8.   (SELECT
  9.     id_registro,
  10.     rut,
  11.     comuna,
  12.     localidad,
  13.     nombrecliente,
  14.     direccion,
  15.     telefonocontacto
  16.     IF(comuna = @nro_comuna, @subitem := @subitem + 1, @subitem:=1) cambio,
  17.     IF(comuna = @nro_comuna, @nro_comuna, @nro_comuna:=comuna) cambia_comuna,
  18.     @subitem sub_item
  19.   FROM datos_2010 d JOIN (SELECT @nro_comuna:=0, @subitem:=1) T1
  20.   ORDER BY comuna, id_registro) T2
  21. WHERE sub_item<=5
  22. ORDER BY comuna, sub_item;
La idea es que genere un listado y vaya numerando de 1 en 1 los que pertenecen a la misma comuna. Cada vez que la comuna cambia en la lista (por eso se necesita ordenarla), se reinicia la numeración.
Eso permitiría separar los primeros cinco puestos de cada columna y listarlos en la consulta exterior...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 01/07/2010, 09:00
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Listado encuesta

Hola Jurena

Gracias por responder.

Te cuento, no tengo alternativa para hacerlo por programación, o sea la alternativa sería por SP, pero ni idea de por donde empezar a armar el query.

La idea es sacar como ejemplo 5 registros de clientes por cada comuna, idelamente de forma aleatoria, pero que cumplan con un par de criterios previos, por ejemplo que esten al día en sus pagos, que pertenescan a determinado segmento (todos datos que manejo en los campos de la tabla).

Siguiendo tu propuesta, listar las comunas no hay problema, hacer la consulta con una de las comunas de la lista tampoco, pero hacer que la consulta recorra toda la lista de comunas ahí me queda grande.

El resultado o la lista de clientes debo luego enviarlo a quien vá a ejecutar la encuesta para que lo cargue a su sistema.

desde ya gracias por la ayuda


PD: acabo de ver tu post gnzsoloyo, gracias lo reviso y te cuento

Chelodelsur
  #7 (permalink)  
Antiguo 01/07/2010, 10:11
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Listado encuesta

Gracias gnzsoloyo

He hecho pruebas y creo que soluciona mi problema, tengo que hacer algunos ajustes en el where para filtrar el tipo de clientes, nada muy complicado.

Ya para darle lujo al tema, ¿existe alguna función o manera de hacer que los clientes selecionados sean aleatorios?

Saludos
  #8 (permalink)  
Antiguo 01/07/2010, 14:06
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Listado encuesta

Acá de nuevo

Bien he ajustado mis filtros y he hecho varias pruebas con las que me voy dando cuenta que el tema del orden aleatorio es más que un lujo. Actualmente la consulta me devuelve los "5" primeros registros por comuna que cumplan los requisitos del where. pero siempre serán los mismo a lo mucho en una siguiente lista los puedo ordenar en DESC.

Pues bien he hecho algunas pruebas con rand() en el order by general y no afecta el resultado pues este depende de la consulta T2. Prové tambien Rand() en el order by de T2 y si aplico un limit lo ejerce para toda la consulta, o sea no salen "5" por comuna si no simplemente "5". y en su defecto si no aplico el limit, pues lista todos los registros de cada comuna.}

Alguna idea de como trabajar el rand() para este query??? o hay otra alternativa???

PD: gnzsoloyo, disculpa pero me podrías dar una breve explicación de como funciona la sub query T2 o dicho de otro modo como lo hace??

Desde ya muchas gracias
  #9 (permalink)  
Antiguo 01/07/2010, 15:51
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: Listado encuesta

Intentemos algo:
Código MySQL:
Ver original
  1.   id_registro,
  2.   rut,
  3.   comuna,
  4.   localidad,
  5.   nombrecliente,
  6.   direccion,
  7.   telefonocontacto
  8.   (SELECT
  9.     id_registro,
  10.     rut,
  11.     comuna,
  12.     localidad,
  13.     nombrecliente,
  14.     direccion,
  15.     telefonocontacto
  16.     IF(comuna = @nro_comuna, @subitem := @subitem + 1, @subitem:=1) cambio,
  17.     IF(comuna = @nro_comuna, @nro_comuna, @nro_comuna:=comuna) cambia_comuna,
  18.     @subitem sub_item
  19.   FROM (SELECT * FROM datos_2010 ORDER BY RAND()) d JOIN (SELECT @nro_comuna:=0, @subitem:=1) T1
  20.   ORDER BY comuna) T2
  21. WHERE sub_item<=5
  22. ORDER BY comuna, sub_item;
__________________
¿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 02/07/2010, 06:45
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Listado encuesta

Muchas gracias gnzsoloyo

funciona, entrega 5 registros aleatorios de clientes para cada una de las comunas

Muchas gracias


Solo una solicitud más y me dejo de mosquear (molestar en "chileno" )

me puedes explicar como haces la partes de los If?? las funciones @nro_comuna , := , @subitem etc..

Desde ya muchas gracias
  #11 (permalink)  
Antiguo 02/07/2010, 07:39
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: Listado encuesta

La teoría es simple, pero empecemos desde el principio:
- Las variables de usuario no tienen tipo ni declaración. Comienzan a existir desde el momento en que invocas una y dejan de existir cuando se cierra la conexión a donde se usaron.
- No se pueden compartir entre conexiones, por lo que, a pesar de existir en el servidor, son inaccesibles para otros usuarios usando otra conexión, aún cuando la conexión sea usando el mismo username y password y desde el mismo host.
- A pesar de ello, estas variables conservan el último valor ingresado durante todo el tiempo de la conexión, por lo que hay que tener mucho cuidado con usar su valor sin inicializarlo: Puede contener basura. Esto es especialmente riesgoso cuando se usan en los SP, ya que son las únicas variables que pueden existir fuera de ellos y ser usadas dentro... Las otras son locales.
- Estas variables adquieren su tipo al ser inicializadas. Hasta entonces su valor es NULL.
- Como valen NULL hasta ser inicializadas, deben serlo antes de ser usadas en una consulta. De allí que un modo sea realizar un JOIN con la inicalización de la variable:
Código MySQL:
Ver original
  1. (SELECT @a:=0)
- Existen dos formas de asignación de valor a una variable de usuario:
Código MySQL:
Ver original
  1. SET @a = 0;
  2. @a := 0;
- La primera forma se usa dentro de los SP, o bien como sentencia independiente. Es indistinto. La otra forma se denomina asignación dinámica, y es la única forma en que pueden usarse dentro de una sentencia SELECT.
- Esto es clave: La asignación dinámica opera en el mismo instante en que aparece, y cambia el valor de la variable en el momento en que está realizando la lectura. Dentro de una sentencia SELECT eso significa que la variable cambia su valor en cada registro encontrado..., y en el mismo orden en que aparezca en la sentencia.
Para darte un ejemplo:
Código MySQL:
Ver original
  1. SELECT @A, NOMBRE, APELLIDO,( @A:= @A+ 1), ( @A:= @A+ 1), ( @A:= @A+ 1)
  2. FROM tablausuarios, JOIN (SELECT @A:=0) T;
Cuando esta sentencia comienza a ejecutarse, se inicializa la variable; cuando pone el primer campo de la primera línea, el valor sigue siendo cero. Pero cuando pone la tercera su valor pasa a ser 1, cuando pone la cuarta columna, pasa a ser 2 y luego 3 al terminar de poner el registro.
Pero atención: cuando pone el primer campo del segundo registro encontrado, su valor es 3, porque fue el último valor adquirido en el último campo del registro anterior...
¿Se entiende la progresión?

En la consulta que te pasé, la lógica dice así:
- La tabla viene ordenada por comuna, pero desordenada por personas.
- En cada registro verifica el valor de la comuna y si es igual , le suma uno al contador, si es diferente le asigna 1. Como la primera vez viene con cero (0), hace la asignación, con lo que el contador sigue en 1.
- A continuación se verifica el valor de la comuna. Si son iguales, solamente representa el valor y si no, lo cambia. Para el siguiente registro, el valor de comuna habrá cambiado, por lo que el acumulador vuelve a 1, y después la comuna continúa valiendo lo mismo...

¿Se comprende la lógica de todo esto?

Cuando las llegas a dominar a estas variables, puedes hacer cosas realmente creativas.
__________________
¿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 02/07/2010, 08:16
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Listado encuesta

Siceramente MUCHAS GRACIAS por todo el tiempo y conocimientos dedicados a dar solución a mi tema.

Saludos desde el sur del mundo

PD me tomará algunos días digerir lo de las variables, muchas gracias

Etiquetas: encuesta, listado
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 16:19.