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

[SOLUCIONADO] Construcción de relaciones y consultas (Mysql)

Estas en el tema de Construcción de relaciones y consultas (Mysql) en el foro de Mysql en Foros del Web. Buenas a todos. Aunque soy un usuario asiduo del foro (en búsqueda de temas), es la primera vez que escribo en el mismo. Primero que ...
  #1 (permalink)  
Antiguo 27/04/2015, 15:23
Avatar de kurt_fj  
Fecha de Ingreso: septiembre-2006
Mensajes: 10
Antigüedad: 17 años, 6 meses
Puntos: 0
Construcción de relaciones y consultas (Mysql)

Buenas a todos.

Aunque soy un usuario asiduo del foro (en búsqueda de temas), es la primera vez que escribo en el mismo.

Primero que nada debo aclarar que estoy aprendiendo sobre las BD y MySQL (uso MariaDB en local).

Paso a hacer una breve descripción para colocarlos en el contexto:

Estoy realizando una base de datos para llevar el control de los expedientes que se crean en un destacamento (comando) de la Guardia Nacional (Fuerzas Armadas). La idea es, de cada expediente físico guardar ciertos datos: nombres de funcionarios, fiscales, imputados (debería tener otro nombre pues ellos no imputan, solo retienen), ente receptor, procedencia y así otras más.

Quisiera, en primer lugar, saber si las relaciones y estructuras son correctas o al menos saber que voy por buen camino. Dejo una imagen del diagrama que he creado con Mysql Workbench:

[URL="https://www.dropbox.com/s/j0ml1o5kbhtftgs/modelo.png?dl=0"]https://www.dropbox.com/s/j0ml1o5kbhtftgs/modelo.png?dl=0[/URL]

Y el diagrama si necesitan ver otras cosas:

[URL="https://www.dropbox.com/s/no67rwnl8eokopl/prueba.mwb?dl=0"]https://www.dropbox.com/s/no67rwnl8eokopl/prueba.mwb?dl=0[/URL]

Estoy dudando de las relaciones porque al momento de querer consultar la información de las actas junto a sus tablas asociadas, cuando no me genera producto cartesiano, me devuelve sólo un registro. Seguramente he creado mal las consultas pero primero necesito su opinión sobre las tablas y sus relaciones, luego, en otro tema colocaré las "chapuzas" de consultas que intento hacer.

Agradecido por cualquier ayuda o comentario.

Me disculpo por la poca o innecesaria información que estoy suministrando. También por lo mal redactado que pueda estar el tema.
  #2 (permalink)  
Antiguo 27/04/2015, 16:30
 
Fecha de Ingreso: febrero-2015
Mensajes: 89
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Construcción de relaciones y consultas (Mysql)

Cita:
Iniciado por kurt_fj Ver Mensaje
Buenas a todos.

Aunque soy un usuario asiduo del foro (en búsqueda de temas), es la primera vez que escribo en el mismo.

Primero que nada debo aclarar que estoy aprendiendo sobre las BD y MySQL (uso MariaDB en local).

Paso a hacer una breve descripción para colocarlos en el contexto:

Estoy realizando una base de datos para llevar el control de los expedientes que se crean en un destacamento (comando) de la Guardia Nacional (Fuerzas Armadas). La idea es, de cada expediente físico guardar ciertos datos: nombres de funcionarios, fiscales, imputados (debería tener otro nombre pues ellos no imputan, solo retienen), ente receptor, procedencia y así otras más.

Quisiera, en primer lugar, saber si las relaciones y estructuras son correctas o al menos saber que voy por buen camino. Dejo una imagen del diagrama que he creado con Mysql Workbench:

[URL="https://www.dropbox.com/s/j0ml1o5kbhtftgs/modelo.png?dl=0"]https://www.dropbox.com/s/j0ml1o5kbhtftgs/modelo.png?dl=0[/URL]

Y el diagrama si necesitan ver otras cosas:

[URL="https://www.dropbox.com/s/no67rwnl8eokopl/prueba.mwb?dl=0"]https://www.dropbox.com/s/no67rwnl8eokopl/prueba.mwb?dl=0[/URL]

Estoy dudando de las relaciones porque al momento de querer consultar la información de las actas junto a sus tablas asociadas, cuando no me genera producto cartesiano, me devuelve sólo un registro. Seguramente he creado mal las consultas pero primero necesito su opinión sobre las tablas y sus relaciones, luego, en otro tema colocaré las "chapuzas" de consultas que intento hacer.

Agradecido por cualquier ayuda o comentario.

Me disculpo por la poca o innecesaria información que estoy suministrando. También por lo mal redactado que pueda estar el tema.
Por lo que entiendo y creo, si quieres "señalar" tus 3 tablas de tipo de actas como primary key deberías crear una primary key con 3 campos ... que serian las fk 3 tablas que señalas.
  #3 (permalink)  
Antiguo 27/04/2015, 18:48
Avatar de kurt_fj  
Fecha de Ingreso: septiembre-2006
Mensajes: 10
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Construcción de relaciones y consultas (Mysql)

Gracias por tu pronta respuesta jmendezg.

Cuando comentas "... tus 3 tablas de tipo de actas..." siento que algo va mal en mi planteamiento. En realidad no son tres tipos de actas, es solo una. Las relaciones N:M de las tres tablas es porque en una misma acta pueden aparecer muchos funcionarios, muchos imputados (sigue sin convencerme esta denominación) y muchas retenciones.

Explico un poco mejor la situación:

Los funcionarios detienen a varias personas. A estas personas se les incauta un arma de fuego, sustancias prohibidas y un auto. Para que los funcionarios puedan crear un acta física deben contar con la presencia de un fiscal público.

En el acta que redactan quedan plasmados los datos de los funcionarios actuantes (generalmente 4 o 5) las personas retenidas (una o varias) el fiscal que a sido testigo del procedimiento, las retenciones realizadas, el destacamento donde se a hecho el acta (siempre será uno) y otros datos más.

Lo que "debería" permitirme el modelo que he creado es guardar todos esos datos de cada acta. Es forma general es lo que busco hacer y es lo que creo que hace el modelo.

Por eso la razón del tema ¿me permite mi modelo obtener los datos de la forma que necesito?.

Gracias de nuevo por la ayuda.
  #4 (permalink)  
Antiguo 28/04/2015, 09:14
 
Fecha de Ingreso: febrero-2015
Mensajes: 89
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Construcción de relaciones y consultas (Mysql)

Que tal, bueno por lo que acabas de explicar... la tabla intermedia de la relación muchos a muchos esta bien,
yo creo que no deberías tener problemas para obtener lo que indicas.

puedes postear el query si persiste el problema. :)
  #5 (permalink)  
Antiguo 29/04/2015, 07:59
Avatar de kurt_fj  
Fecha de Ingreso: septiembre-2006
Mensajes: 10
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Construcción de relaciones y consultas (Mysql)

Saludos.

Leyendo un poco más sobre bases de datos me he encontrado con que el esquema de mi db es uno llamado copo de nieve (al menos es lo que entiendo).

He armado una consulta para probar cómo se muestran los datos. Por ahora uso
Código:
left join
pues hay un acta que no esta asociada a todas las tablas N:M pero planeo usar
Código:
inner join
este es el código:

Código MySQL:
Ver original
  1. a.actas_id 'N Acta',
  2. date_format(a.fecha, '%d/%m/%Y') 'Fecha Acta',
  3. -- Origen
  4. concat_ws(' ',co.compania,'Compañía','(',pu.puesto,')') 'Origen',
  5. -- Ente Receptor
  6. er.ente 'Ente Receptor',
  7. -- Funcionario(s)
  8. concat_ws(' ',ra.siglas,fu.p_apellido,fu.p_nombre) 'Funcionario(s)',
  9. -- Fiscal
  10. concat_ws(' ',fi.fis_cedula,fi.p_apellido,fi.p_nombre) 'Fiscal',
  11. -- Imputado(s)
  12. concat_ws(' ',im.imp_cedula,im.p_apellido,im.p_nombre) 'Imputado(s)',
  13. retencion 'Retencion(es)',
  14. -- usuario
  15. concat_ws(' ',us.apellido,us.nombre) 'Creado por:'
  16. from actas a
  17. -- Funcionario(s)
  18. left join actas_has_funcionarios ahf on ahf.fk_actas_id = a.actas_id
  19. left join funcionarios fu on fu.fun_cedula = ahf.fk_funcionarios_cedula
  20. left join rangos ra on ra.rangos_id = fu.fk_rangos_id
  21. -- Imputados(s)
  22. left join actas_has_imputados ahi on ahi.fk_actas_id = a.actas_id
  23. left join imputados im on im.imp_cedula = ahi.fk_imputados_cedula
  24. -- Retencion(es)
  25. left join actas_has_retenciones ahr on ahr.fk_actas_id = a.actas_id
  26. left join retenciones re on re.retenciones_id = ahr.fk_retenciones_id
  27. -- Fiscal
  28. left join fiscales fi on fi.fis_cedula = a.fk_fiscales_cedula
  29. -- Ente Receptor
  30. left join entes_receptores er on er.ente_id = a.fk_entes_receptores_id
  31. -- Origen
  32. left join puestos pu on pu.puestos_id = a.fk_puestos_id
  33. left join companias co on co.companias_id = pu.fk_companias_id
  34. -- Usuario
  35. left join usuarios us on us.usuario_id = a.fk_usuarios_id;

Esta consulta me devuelve:

Código MySQL:
Ver original
  1. +-----------+------------+------------------------------------+---------------+---------------------+--------------------+-------------------------+-----------------------+------------------+
  2. | N Acta    | Fecha Acta | Origen                             | Ente Receptor | Funcionario(s)      | Fiscal             | Imputado(s)             | Retencion(es)         | Creado por:      |
  3. +-----------+------------+------------------------------------+---------------+---------------------+--------------------+-------------------------+-----------------------+------------------+
  4. | 1b99089c4 | 13/04/2015 | Primera Compañía ( Peaje I )       | Fiscalía 1º   | TCNEL García Dilia  | 2468135 Cate Ali   | 12345678 Carmona Carlos | Persona               | González Freddy  |
  5. | 1b99089c4 | 13/04/2015 | Primera Compañía ( Peaje I )       | Fiscalía 1º   | TCNEL García Dilia  | 2468135 Cate Ali   | 12345678 Carmona Carlos | Arma de Fuego         | González Freddy  |
  6. | 1b99089c4 | 13/04/2015 | Primera Compañía ( Peaje I )       | Fiscalía 1º   | TCNEL García Dilia  | 2468135 Cate Ali   | 12345678 Carmona Carlos | Productos Varios      | González Freddy  |
  7. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TTE Rambo Jhon      | 9876543 Brito Alan | 11223344 Pérez Pedro    | Auto                  | González Freddy  |
  8. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TTE Rambo Jhon      | 9876543 Brito Alan | 11223344 Pérez Pedro    | Equipos               | González Freddy  |
  9. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TTE Rambo Jhon      | 9876543 Brito Alan | 11223344 Pérez Pedro    | Sustancias            | González Freddy  |
  10. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TTE Rambo Jhon      | 9876543 Brito Alan | 11223344 Pérez Pedro    | Herramientas o Partes | González Freddy  |
  11. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TTE Rambo Jhon      | 9876543 Brito Alan | 12345678 Carmona Carlos | Auto                  | González Freddy  |
  12. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TTE Rambo Jhon      | 9876543 Brito Alan | 12345678 Carmona Carlos | Equipos               | González Freddy  |
  13. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TTE Rambo Jhon      | 9876543 Brito Alan | 12345678 Carmona Carlos | Sustancias            | González Freddy  |
  14. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TTE Rambo Jhon      | 9876543 Brito Alan | 12345678 Carmona Carlos | Herramientas o Partes | González Freddy  |
  15. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TCNEL García Dilia  | 9876543 Brito Alan | 11223344 Pérez Pedro    | Auto                  | González Freddy  |
  16. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TCNEL García Dilia  | 9876543 Brito Alan | 11223344 Pérez Pedro    | Equipos               | González Freddy  |
  17. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TCNEL García Dilia  | 9876543 Brito Alan | 11223344 Pérez Pedro    | Sustancias            | González Freddy  |
  18. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TCNEL García Dilia  | 9876543 Brito Alan | 11223344 Pérez Pedro    | Herramientas o Partes | González Freddy  |
  19. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TCNEL García Dilia  | 9876543 Brito Alan | 12345678 Carmona Carlos | Auto                  | González Freddy  |
  20. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TCNEL García Dilia  | 9876543 Brito Alan | 12345678 Carmona Carlos | Equipos               | González Freddy  |
  21. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TCNEL García Dilia  | 9876543 Brito Alan | 12345678 Carmona Carlos | Sustancias            | González Freddy  |
  22. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | TCNEL García Dilia  | 9876543 Brito Alan | 12345678 Carmona Carlos | Herramientas o Partes | González Freddy  |
  23. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | SM/2 Mora Manuel    | 9876543 Brito Alan | 11223344 Pérez Pedro    | Auto                  | González Freddy  |
  24. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | SM/2 Mora Manuel    | 9876543 Brito Alan | 11223344 Pérez Pedro    | Equipos               | González Freddy  |
  25. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | SM/2 Mora Manuel    | 9876543 Brito Alan | 11223344 Pérez Pedro    | Sustancias            | González Freddy  |
  26. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | SM/2 Mora Manuel    | 9876543 Brito Alan | 11223344 Pérez Pedro    | Herramientas o Partes | González Freddy  |
  27. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | SM/2 Mora Manuel    | 9876543 Brito Alan | 12345678 Carmona Carlos | Auto                  | González Freddy  |
  28. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | SM/2 Mora Manuel    | 9876543 Brito Alan | 12345678 Carmona Carlos | Equipos               | González Freddy  |
  29. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | SM/2 Mora Manuel    | 9876543 Brito Alan | 12345678 Carmona Carlos | Sustancias            | González Freddy  |
  30. | 1b99089c5 | 14/04/2015 | Primera Compañía ( Petroguárico )  | Fiscalía 2º   | SM/2 Mora Manuel    | 9876543 Brito Alan | 12345678 Carmona Carlos | Herramientas o Partes | González Freddy  |
  31. | 1b99089c6 | 14/04/2015 | Primera Compañía ( Chaguaramas )   | Fiscalía 2º   |                     | 9876543 Brito Alan |                         | NULL                  | González Freddy  |
  32. +-----------+------------+------------------------------------+---------------+---------------------+--------------------+-------------------------+-----------------------+------------------+
Con eso recupero todos los datos de las actas, pero, ¿es factible cuando sean más las actas? ¿No penalizará el rendimiento? la mayor cantidad que se piensa mostrar el actas por año.
  #6 (permalink)  
Antiguo 30/04/2015, 22:44
Avatar de kurt_fj  
Fecha de Ingreso: septiembre-2006
Mensajes: 10
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Construcción de relaciones y consultas (Mysql)

Buenas a todos.

He conseguido los resultados que deseaba con la siguiente consulta:

Código MySQL:
Ver original
  1. a.acta_id 'acta',
  2. DATE_FORMAT(a.fecha, '%d/%m/%Y') 'f_acta',
  3. -- Origen
  4. CONCAT_WS('',co.compania,' Compañía ','(',pu.puesto,')') 'origen',
  5. -- Ente Receptor
  6. er.ente 'ente_receptor',
  7. -- Funcionario(s)
  8. GROUP_CONCAT(DISTINCT ra.siglas, ' ', fu.p_apellido, ' ', fu.p_nombre ORDER BY ra.rangos_id ASC SEPARATOR ', ') 'funcionarios',
  9. -- Fiscal
  10. CONCAT_WS(' ',fi.fis_cedula,fi.p_apellido,fi.p_nombre) 'fiscal',
  11. -- Imputado(s)
  12. GROUP_CONCAT(DISTINCT im.imp_cedula, ' ', im.p_apellido, ' ', im.p_nombre SEPARATOR ', ') 'imputados',
  13. -- Retencion(es)
  14. GROUP_CONCAT(DISTINCT re.retencion SEPARATOR ', ')'retenciones',
  15. -- usuario
  16. CONCAT_WS(' ',us.apellido,us.nombre) 'creador'
  17. FROM actas a
  18. -- Imputados(s)
  19. LEFT JOIN actas_has_imputados ahi ON ahi.fk_actas_id = a.acta_id
  20. LEFT JOIN imputados im ON im.imp_cedula = ahi.fk_imputados_cedula
  21. -- Funcionario(s)
  22. LEFT JOIN actas_has_funcionarios ahf ON ahf.fk_actas_id = a.acta_id
  23. LEFT JOIN funcionarios fu ON fu.fun_cedula = ahf.fk_funcionarios_cedula
  24. LEFT JOIN rangos ra ON ra.rangos_id = fu.fk_rangos_id
  25. -- Retencion(es)
  26. LEFT JOIN actas_has_retenciones ahr ON ahr.fk_actas_id = a.acta_id
  27. LEFT JOIN retenciones re ON re.retenciones_id = ahr.fk_retenciones_id
  28. -- Fiscal
  29. LEFT JOIN fiscales fi ON fi.fis_cedula = a.fk_fiscales_cedula
  30. -- Ente Receptor
  31. LEFT JOIN entes_receptores er ON er.ente_id = a.fk_entes_receptores_id
  32. -- Origen
  33. LEFT JOIN puestos pu ON pu.puestos_id = a.fk_puestos_id
  34. LEFT JOIN companias co ON co.companias_id = pu.fk_companias_id
  35. -- Usuario
  36. LEFT JOIN usuarios us ON us.usuario_id = a.fk_usuarios_id
  37. GROUP BY a.acta_id;

y me da como resultado:

Código MySQL:
Ver original
  1. +-----------+------------+--------------------------------+---------------+-------------------------------------------------------+
  2. | acta      | f_acta     | origen                         | ente_receptor | funcionarios                                          |
  3. +-----------+------------+--------------------------------+---------------+-------------------------------------------------------+
  4. | 1b99089c4 | 13/04/2015 | Primera Compaa (Peaje I)       | Fiscalía 1º   | TCNEL García Dilia                                    |
  5. | 1b99089c5 | 14/04/2015 | Primera Compaa (Petroguárico)  | Fiscalía 2º   | TCNEL García Dilia, TTE Rambo Jhon, SM/2 Mora Manuel  |
  6. | 1b99089c6 | 14/04/2015 | Primera Compaa (Chaguaramas)   | Fiscalía 2º   | NULL                                                  |
  7. +-----------+------------+--------------------------------+---------------+-------------------------------------------------------+
  8.  
  9. +--------------------+------------------------------------------------+--------------------------------------------------+------------------+
  10. | fiscal             | imputados                                      | retenciones                                      | creador          |
  11. +--------------------+------------------------------------------------+--------------------------------------------------+------------------+
  12. | 2468135 Cate Ali   | 12345678 Carmona Carlos                        | Persona, Arma de Fuego, Productos Varios         | González Freddy  |
  13. | 9876543 Brito Alan | 11223344 Pérez Pedro, 12345678 Carmona Carlos  | Auto, Equipos, Sustancias, Herramientas o Partes | González Freddy  |
  14. | 9876543 Brito Alan | NULL                                           | NULL                                             | González Freddy  |
  15. +--------------------+------------------------------------------------+--------------------------------------------------+------------------+

He dividido el resultado de la consulta en dos partes para mejorar la visualización.

Justo así quería que se devolviera la consulta. Solo me queda modificar el left por inner en las joins.

La forma de presentar los datos ya va por cuenta del lenguaje de programación (PHP).

Algún comentario o sugerencia sobre la consulta es bienvenida.

Última edición por kurt_fj; 30/04/2015 a las 22:49 Razón: algunas correciones en código

Etiquetas: bd, registro, relaciones, sql, 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 02:08.