Autor Tema: Query para MySQL  (Leído 4772 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Query para MySQL
« 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:
Código: (VB) [Seleccionar]
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
« última modificación: Octubre 15, 2013, 09:22:47 pm por YAcosta »

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Query para MySQL
« Respuesta #1 en: Octubre 16, 2013, 12:16:22 am »
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)

Código: (sql) [Seleccionar]
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



Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Query para MySQL
« Respuesta #2 en: Octubre 16, 2013, 12:50:48 am »
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

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Query para MySQL
« Respuesta #3 en: Octubre 16, 2013, 11:07:18 am »
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.

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Query para MySQL
« Respuesta #4 en: Octubre 16, 2013, 11:50:59 am »
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

Código: (SQL) [Seleccionar]
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;

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Query para MySQL
« Respuesta #5 en: Octubre 16, 2013, 11:12:40 pm »
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í:
Código: (SQL) [Seleccionar]
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.edadminima
El número 32128 es el id de la persona estoy evaluando.
¡Muchas gracias!

Jerónimo
« última modificación: Octubre 16, 2013, 11:18:22 pm por Jeronimo »

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Query para MySQL
« Respuesta #6 en: Octubre 17, 2013, 11:00:25 am »
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

wolf_kof

  • Visitante
Re:Query para MySQL
« Respuesta #7 en: Octubre 21, 2013, 07:02:12 pm »
Utilia SQLYog muy buen administrador de base de datos de MySQL y tiene una excelente aplicación para hacer consultas.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Query para MySQL
« Respuesta #8 en: Octubre 22, 2013, 11:44:33 pm »
Lo voy a probar.
¡Muchas gracias!

Jerónimo