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

optimizar consulta

Estas en el tema de optimizar consulta en el foro de Mysql en Foros del Web. hola, tengo tres tablas sacramento, saparticipante y persona , en la tabla saparticipante guardo todas las personas que participaron y como participo en ese sacramento ...
  #1 (permalink)  
Antiguo 19/10/2011, 13:05
 
Fecha de Ingreso: septiembre-2011
Ubicación: Colombia
Mensajes: 17
Antigüedad: 13 años, 2 meses
Puntos: 2
Pregunta optimizar consulta

hola, tengo tres tablas sacramento, saparticipante y persona, en la tabla saparticipante guardo todas las personas que participaron y como participo en ese sacramento (madre, abuelo paterno, padre, madrina, padrino, testigo, etc) en un sacramento, he tratado de sacar una consulta que me muestre por fila todos las personas que participaron en ese sacramento, hice una y me funciona pero no se si existe una forma de hacerlo mas practico con la utilizacion de JOIN's... resalto que sé cuantas personas son por sacramento y la idea es sacar una consulta por sacramento, bautismo, confirmacion, matrimonio, defuncion.
la estructura de las tablas son las siguiente:

el campo IdPersonaTipo tiene el id de la tabla saparticipantetipo que contiene el tipo de persona que es (madre, abuelo paterno, padre, madrina, padrino, celebrante, testigo, etc) en el sacramento y esta cargada con el siguiente contenido:

Código MySQL:
Ver original
  1. IdTipo Tipo
  2. 1   Padre
  3. 2   Madre
  4. 3   Padre Esposo
  5. 4   Madre Esposo
  6. 5   Padre Esposa
  7. 6   Madre Esposa
  8. 7   Abuelo Padre
  9. 8   Abuela Padre
  10. 9   Abuelo Madre
  11. 10  Abuela Madre
  12. 11  Testigo 1
  13. 12  Testigo 2
  14. 13  Madrina
  15. 14  Padrino
  16. 15  Persona 1
  17. 16  Persona 2
  18.  
  19.  
  20.  
  21. CREATE TABLE saparticipante (
  22.   IdSacramento int(11) NOT NULL DEFAULT '0',
  23.   IdPersona int(11) NOT NULL DEFAULT '0',
  24.   IdPersonaTipo int(11) NOT NULL DEFAULT '0',
  25.   PRIMARY KEY (IdSacramento,IdPersona,IdPersonaTipo)
  26.  
  27. CREATE TABLE sacramento (
  28.   IdSacramento int(11) unsigned NOT NULL AUTO_INCREMENT,
  29.   IdParroquia int(11) unsigned NOT NULL DEFAULT '1',
  30.   ActaTipo int(11) unsigned NOT NULL DEFAULT '0',
  31.   FechaIns date NOT NULL DEFAULT '1900-01-01',
  32.   FechaCel date NOT NULL DEFAULT '1900-01-01',
  33.   IdMinistro int(11) unsigned NOT NULL DEFAULT '0',
  34.   IdParroco int(11) unsigned NOT NULL DEFAULT '0',
  35.   Libro varchar(5) NOT NULL DEFAULT '',
  36.   Folio varchar(5) NOT NULL DEFAULT '',
  37.   Acta varchar(5) NOT NULL DEFAULT '',
  38.   NotaMarginal int(11) NOT NULL DEFAULT '1',
  39.   Observacion text NOT NULL,
  40.   Confirmado char(1) NOT NULL DEFAULT 'N',
  41.   PRIMARY KEY (IdActa)
  42.  
  43. CREATE TABLE persona (
  44.   IdPersona int(11) unsigned NOT NULL AUTO_INCREMENT,
  45.   ApellidoP varchar(25) NOT NULL DEFAULT '',
  46.   ApellidoM varchar(25) NOT NULL DEFAULT '',
  47.   Nombre varchar(50) NOT NULL DEFAULT '',
  48.   EstadoCivil int(11) NOT NULL DEFAULT '1',
  49.   Sexo int(11) unsigned NOT NULL DEFAULT '1',
  50.   Documento int(11) NOT NULL DEFAULT '1',
  51.   NumeroDoc varchar(15) NOT NULL DEFAULT '',
  52.   FechaNacimiento date NOT NULL DEFAULT '1900-01-01',
  53.   DptoNacimiento int(11) NOT NULL DEFAULT '1',
  54.   McpioNacimiento int(11) NOT NULL DEFAULT '1',
  55.   FechaBautismo date NOT NULL DEFAULT '1900-01-01',
  56.   LibroBautismo int(3) unsigned NOT NULL DEFAULT '0',
  57.   FolioBautismo int(4) unsigned NOT NULL DEFAULT '0',
  58.   ActaBautismo int(4) unsigned NOT NULL DEFAULT '0',
  59.   DptoBautismo int(11) NOT NULL DEFAULT '1',
  60.   McpioBautismo int(11) NOT NULL DEFAULT '1',
  61.   IdParroquiaBautismo int(11) unsigned NOT NULL DEFAULT '1',
  62.   Domicilio varchar(100) NOT NULL DEFAULT '',
  63.   DptoDomicilio int(11) NOT NULL DEFAULT '1',
  64.   McpioDomicilio int(11) NOT NULL DEFAULT '1',
  65.   Telefono varchar(7) NOT NULL DEFAULT '',
  66.   Celular varchar(10) NOT NULL DEFAULT '',
  67.   EMail varchar(100) NOT NULL DEFAULT '',
  68.   Observacion text NOT NULL,
  69.   PRIMARY KEY (IdPersona),
  70.   KEY DptoNacimiento (DptoNacimiento)

la consulta que tengo es esta y le agradeceria mucho a la persona que logre como optimizar esta consulta..
muchas gracias:

Código MySQL:
Ver original
  1. SELECT sp.IdPersona idp, TRIM(CONCAT(p.ApellidoP, ' ', p.ApellidoM, ' ', p.Nombre)) persona_,
  2. idp1, padre, idp2, abuelo_paterno, idp3, abuela_paterna, idp4, madre, idp5, abuelo_materno, idp6, abuela_materna, idp7,
  3. padrino, idp8, madrina
  4. FROM persona p INNER JOIN saparticipante sp ON sp.IdPersona=p.IdPersona AND sp.IdSacramento=2 AND sp.IdPersonaTipo=15, #persona
  5. (SELECT sp1.IdPersona idp1, TRIM(CONCAT(p1.ApellidoP, ' ', p1.ApellidoM, ' ', p1.Nombre)) padre FROM persona p1
  6. INNER JOIN saparticipante sp1 ON sp1.IdPersona=p1.IdPersona AND sp1.IdSacramento=2 AND sp1.IdPersonaTipo=1) p_1, #padre
  7. (SELECT sp2.IdPersona idp2, TRIM(CONCAT(p2.ApellidoP, ' ', p2.ApellidoM, ' ', p2.Nombre)) abuelo_paterno FROM persona p2
  8. INNER JOIN saparticipante sp2 ON sp2.IdPersona=p2.IdPersona AND sp2.IdSacramento=2 AND sp2.IdPersonaTipo=7) p_2, #abuelo_paterno
  9. (SELECT sp3.IdPersona idp3, TRIM(CONCAT(p3.ApellidoP, ' ', p3.ApellidoM, ' ', p3.Nombre)) abuela_paterna FROM persona p3
  10. INNER JOIN saparticipante sp3 ON sp3.IdPersona=p3.IdPersona AND sp3.IdSacramento=2 AND sp3.IdPersonaTipo=8) p_3, #abuela_paterna
  11. (SELECT sp4.IdPersona idp4, TRIM(CONCAT(p4.ApellidoP, ' ', p4.ApellidoM, ' ', p4.Nombre)) madre FROM persona p4
  12. INNER JOIN saparticipante sp4 ON sp4.IdPersona=p4.IdPersona AND sp4.IdSacramento=2 AND sp4.IdPersonaTipo=2) p_4, #madre
  13. (SELECT sp5.IdPersona idp5, TRIM(CONCAT(p5.ApellidoP, ' ', p5.ApellidoM, ' ', p5.Nombre)) abuelo_materno FROM persona p5
  14. INNER JOIN saparticipante sp5 ON sp5.IdPersona=p5.IdPersona AND sp5.IdSacramento=2 AND sp5.IdPersonaTipo=9) p_5, #abuelo_materno
  15. (SELECT sp6.IdPersona idp6, TRIM(CONCAT(p6.ApellidoP, ' ', p6.ApellidoM, ' ', p6.Nombre)) abuela_materna FROM persona p6
  16. INNER JOIN saparticipante sp6 ON sp6.IdPersona=p6.IdPersona AND sp6.IdSacramento=2 AND sp6.IdPersonaTipo=10) p_6, #abuela_materna
  17. (SELECT sp7.IdPersona idp7, TRIM(CONCAT(p7.ApellidoP, ' ', p7.ApellidoM, ' ', p7.Nombre)) padrino FROM persona p7
  18. INNER JOIN saparticipante sp7 ON sp7.IdPersona=p7.IdPersona AND sp7.IdSacramento=2 AND sp7.IdPersonaTipo=14) p_7, #padrino
  19. (SELECT sp8.IdPersona idp8, TRIM(CONCAT(p8.ApellidoP, ' ', p8.ApellidoM, ' ', p8.Nombre)) madrina FROM persona p8
  20. INNER JOIN saparticipante sp8 ON sp8.IdPersona=p8.IdPersona AND sp8.IdSacramento=2 AND sp8.IdPersonaTipo=13) p_8 #madrina

esta consulta me arroja todas las personas que participaron en un bautismo que corresponde al id=2

Última edición por hendaviher; 19/10/2011 a las 13:28 Razón: Modifique la estructura de la tabla

Etiquetas: joins
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 08:11.