Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: Jeronimo en Octubre 15, 2013, 08:08:05 pm
-
Necesito la ayuda de ustedes para ver si puedo realizar esta consulta.
Lo que hago es definir grupos (tablas 'grupos' y 'gruposdetalle'), según la edad y el sexo, y conformarlos asignando el id del grupo a cada persona en la tabla 'personas'.
Las tablas son las siguientes:
Grupos
Id Nombre
1 Familia tipo 1
2 Familia numerosa
n
GruposDetalle
id_grupo EdadMinima EdadMaxima Cantidad Sexo
1 0 8 2 I (indiferente)
1 20 40 2 I
n
Personas
Id Nombre ... Edad Sexo id_grupo
1 Juan 35 M 1
2 María 28 F 1
n
Lleno un combo con los datos de los grupos de la siguiente manera:
Query = _
"SELECT g.id, g.nombre, GROUP_CONCAT(CONVERT(CONCAT_WS(';', gd.edadminima, gd.edadmaxima, gd.sexo), CHAR)
ORDER BY gd.edadminima, gd.edadmaxima SEPARATOR '|') AS detalle
FROM grupos AS g, gruposdetalle AS gd
WHERE g.id = gd.id_grupo
GROUP BY gd.id_grupo ORDER BY g.nombre, gd.edadminima"
Tabla.Open Query, BD, adOpenStatic, adLockOptimistic
Esto es para obtener el id y el nombre del grupo y luego los datos de edad mínima, edad máxima y sexo concatenados en la misma fila (mil disculpas a los ortodoxos :P).
Ahora lo que necesito es eso mismo, es decir, que la consulta traiga los mismos datos, pero esta vez solo de los grupos en los que podría encajar, por ejemplo, un hombre (sexo M) de 20 años, o sea, todos aquellos grupos que tengan una edad mínima <= 20 Y una edad máxima >= 20 Y sexo M.
Ahí es donde empiezo a hacer lío.
No sé si fui claro... espero haberlo sido.
Desde ya, si lo que hice es una burrada y alguien quiere sugerirme una manera para hacerlo mejor, me vendría 10 puntos.
¡Muchas gracias!
Jerónimo
EDIT: Sorry doc, no entendi muy bien a pesar de haberte formateado el post (recomendable usar el codigo Visual Basic en el foro) porque lo lei muy rapido, si algun colega lo detecta bien, sino mas tarde que llegue a casa le doy una leida con paciencia. Suerte
-
Haber si entiendo bien.
En la tabla de personas no tienen un id_grupo asignado, y vos quieres una consulta para ver en que grupo pueden encajar, cierto?
Quizás haya alguna forma más directa o pensada (y con más performance seguro). Se me ocurre juntar las personas y los grupos con inner joins ( con 2 condiciones, edad entre max y minimo)
Algo así (ni idea si funcionará, habria que probar)
SELECT p.Id, p.Nombre, g.Nombre
FROM Personas p, GruposDetalle gd
INNER JOIN Grupos g ON gd.id_grupo = g.id
WHERE p.Edad BETWEEN gd.EdadMinima AND gd.EdadMaxima
PD: Te saldran personas o grupos repetidos, se puede arreglar con un group_concat y group by... pero bueno, primero hay que ver si eso funciona x'D
-
Hola, Raúl.
El concepto es como decís, pero lo que yo quiero es, dado una persona con una edad y un sexo, ver en qué grupos podría encajar.
Imaginá una ficha de un empleado, un afiliado, un socio o lo que fuere. Tenés los datos personales y debés incorporarlo a un grupo. Para ello quiero llenar un combo solo con los grupos que podría integrar, es decir, hacer algo como lo que puse en el primer post pero limitar el resultado de la búsqueda (la consulta del primer post trae todos los grupos) a los grupos que podría integrar esa persona.
Por ejemplo: Juan, sexo M, 30 años. Quiero saber, con la estructura de grupos que tengo, en cuáles podría encajar.
Si tengo los grupos:
Grupo
id Nombre
1 Grupo1
2 Grupo2
3 Grupo3
Grupodetalle
id_grupo edadminima edadmaxima sexo
1 0 18 F
1 0 18 M
1 19 25 F
2 20 30 F
2 20 40 M
3 10 50 I (indiferente)
En este ejemplo, Juan, con sexo M y 30 años encajaría en el Grupo2 y en el Grupo3. Después el usuario debiera determinar, seleccionando el grupo en el combo, en cuál de los dos lo pondría.
¡Muchas gracias!
Jerónimo
-
Se me ocurre en el aire algo asi:
SELECT ID, Nombre FROM Grupos
WHERE ID IN ( SELECT ID_grupo WHERE EdadInput > EdadMinima AND EdadInput < EdadMaxima)
No se si ID y ID_grupo no se tienen que llamar de la misma manera.
-
Aca esta, solo habia que agregar el filtro al Sexo en el codigo que tenia
http://sqlfiddle.com/#!2/f2bb9/7
Por si no se ve: el código seria este
SELECT p.Id, p.Nombre, GROUP_CONCAT(CONCAT_WS(',', gd.id_grupo) ORDER BY gd.id_grupo) AS 'PosiblesGrupos'
FROM Personas p, GruposDetalle gd
WHERE
(p.Edad BETWEEN gd.EdadMinima AND gd.EdadMaxima)
AND IF(gd.Sexo='I', TRUE, gd.Sexo=p.Sexo)
GROUP BY p.id
ORDER BY p.Id;
-
Algo así hice. Hasta ahora, con las pruebas que hice, me dio buen resultado. Me quedó bastante enquilombada, pero por lo que vi, hasta ahora funca.
La consulta quedó así:
SELECT g.id, g.nombre, GROUP_CONCAT(CONVERT(CONCAT_WS(';', gd.edadminima, gd.edadmaxima, gd.sexo), CHAR) ORDER BY gd.edadminima, gd.edadmaxima SEPARATOR '|') AS detalle
FROM grupos AS g, gruposdetalle AS gd, (SELECT g2.id FROM grupos AS g2, gruposedades AS gd2, (SELECT personas.edad FROM personas WHERE personas.id = 32128) AS p
WHERE p.edad >= gd2.edadminima AND p.edad <= gd2.edadmaxima AND g2.id = gd2.id_grupo GROUP BY gd2.id_grupo ORDER BY g2.nombre, gd2.edadminima) AS g3
WHERE g.id = g3.id AND g.id = gd.id_grupo GROUP BY gd.id_grupo ORDER BY g.nombre, gd.edadminimaEl número 32128 es el id de la persona estoy evaluando.
¡Muchas gracias!
Jerónimo
-
Perdón, no había visto la edición, por parte del moderador, de mi primer post.
Yo había usado el botón de "Insertar código" (#). Nunca había visto el desplegable para los códigos.
Gracias por la advertencia.
Jerónimo
-
Utilia SQLYog muy buen administrador de base de datos de MySQL y tiene una excelente aplicación para hacer consultas.
-
Lo voy a probar.
¡Muchas gracias!
Jerónimo