Autor Tema: [Pregunta] Consulta a multiples tablas en MySQL  (Leído 7519 veces)

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

Desconectado 0rion

  • Trade Count: (0)
  • MiembrosReales
  • *
  • Thank You
  • -Given: 7
  • -Receive: 0
  • Mensajes: 46
[Pregunta] Consulta a multiples tablas en MySQL
« : abril 26, 2012, 12:27:05 pm »
Buen día communiters, mi problema de hoy es el siguiente, tengo una base de datos en MySQL, que esta hecha para algo así como la administración académica de una universidad, mi problema es cuando quiero hacer una consulta de las notas de un alumno en todas las materias que ha cursado y está cursando, pues no logro que me muestre bien las materias, pues el alumno para cursar una materia debe estar inscrito en un grupo de clases, la `materia` esta relacionada al `grupo` con relación de uno a muchos, y el `alumno` está relacionado al grupo con relación de muchos a muchos, por lo cual creé la tabla `notas` que guarda las notas que un alumno obtiene por ser parte del grupo y a la ves sirve como entidad relacional entre `alumno`y `grupo`, pero por esto al hacer una consulta no se como averiguar de que materia son las notas que el alumno tiene, pues en la tabla `notas` no se hace referencia a la materia, sino en la tabla `grupo`, pero tendría que hacer una consulta que me saque el nombre de la materia a la que hace referencia el campo `grupo`.`materia` en el registro de la tabla `grupo` al que hace referencia cada registro de la tabla `notas` que esté relacionado con determinado alumno. La consulta que estoy utilizando actualmente es la siguiente:

Código: [Seleccionar]
SELECT `notas`.`alumno`, `materia`.`nombre` AS materia,
(`notas`.`com1lab1`*0.3)+(`notas`.`com1lab2`*0.3)+(`notas`.`com1par`*0.4) AS 'computo 1',
(`notas`.`com2lab1`*0.3)+(`notas`.`com2lab2`*0.3)+(`notas`.`com2par`*0.4) AS 'computo 2',
(`notas`.`com3lab1`*0.3)+(`notas`.`com3lab2`*0.3)+(`notas`.`com3par`*0.4) AS 'computo 3'
FROM `notas`, `grupo`, `materia`
WHERE `notas`.`alumno` = 'smis052211'
AND `materia`.`id` = (SELECT `grupo`.`materia` FROM `grupo` WHERE `grupo`.`id` = `notas`.`grupo`);

Y el resultado es este:
alumnomateriacomputo 1computo 2computo 3
smis052211Matematica Computacional I9.5505.2800.000
smis052211Matematica Computacional I9.5505.2800.000
smis052211Matematica Computacional I9.5505.2800.000

Tomen en cuenta que este alumno sólo está inscrito en un grupo de clase, de la materia Matematica Computacional I, no se porque salen tres registros, y si pueden también me podrían explicar como hago que el resultado de las notas salga con formato de (0.00) osea solo dos decimales. De antemano gracias por su ayuda
« Última Modificación: abril 26, 2012, 01:43:06 pm por hkadejo »


Desconectado tekun

  • -^- Elite Silver -^-
  • Trade Count: (1)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 101
  • Mensajes: 3193
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re:Una consulta un poco dificil
« Respuesta #1 : abril 26, 2012, 01:30:57 pm »
pega el ddl de las tablas: alumnos, grupos, notas y materias.... y si no son facil de entender los nombres de los campos, agregame una definición sencilla de cada campo
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado hkadejo

  • Global Moderator
  • Trade Count: (0)
  • The Communiter-
  • *
  • Thank You
  • -Given: 277
  • -Receive: 929
  • Mensajes: 3313
    • AndroidJutsu
Re:[Pregunta] Consulta a multiples tablas en MySQL
« Respuesta #2 : abril 26, 2012, 01:44:35 pm »
 :offtopic:

Pongan nombres mas descriptivos a sus temas. "Una consulta un poco dificil"  no ayuda a nadie para saber de que trata el problema, asi que mucho menos van a considerar leerlo y ayudar.
Follow members gave a thank to your post:
Ayudo a no programadores y programadores novatos con tutoriales, código y consejos a convertirse en desarrolladores Android profesionales y crear apps geniales.

DESCARGA MI GUÍA -> https://androidjutsu.com/guia-crea-tu-primera-aplicacion-android/

Desconectado Non Servium

  • Trade Count: (0)
  • Sv Member
  • ***
  • Thank You
  • -Given: 6
  • -Receive: 39
  • Mensajes: 425
  • Ilix Punx :)
Re:[Pregunta] Consulta a multiples tablas en MySQL
« Respuesta #3 : abril 26, 2012, 02:47:47 pm »
Usar
Código: [Seleccionar]
FROM `notas`, `grupo`, `materia`significa que estas usando una consulta como producto cartesiano. Filas de notas x filas de grupo x filas de materia y eso no tiene sentido. Pero pega las tablas como dice tekun para ver cómo tendrías que hacer el INNER JOIN
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch

Desconectado 0rion

  • Trade Count: (0)
  • MiembrosReales
  • *
  • Thank You
  • -Given: 7
  • -Receive: 0
  • Mensajes: 46
Re:[Pregunta] Consulta a multiples tablas en MySQL
« Respuesta #4 : abril 26, 2012, 02:48:40 pm »
Gracias por lo del nombre, es que no se me ocurrió algo mejor no soy muy creativo, y lamentablemente tampoco soy bueno explicando. La estructura de las tablas es esta:

Código: [Seleccionar]
CREATE TABLE IF NOT EXISTS `materia` (
  `id` int(3) NOT NULL,
  `nombre` varchar(50) COLLATE latin1_spanish_ci NOT NULL,
  `UV` int(1) NOT NULL DEFAULT '4',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;

CREATE TABLE IF NOT EXISTS `alumno` (
  `codigo` varchar(10) COLLATE latin1_spanish_ci NOT NULL,
  `nombre` varchar(50) COLLATE latin1_spanish_ci NOT NULL,
  `apellidos` varchar(50) COLLATE latin1_spanish_ci NOT NULL,
  `direccion` varchar(55) COLLATE latin1_spanish_ci DEFAULT NULL,
  `telefono` int(8) NOT NULL,
  `e-mail` varchar(50) COLLATE latin1_spanish_ci NOT NULL,
  PRIMARY KEY (`codigo`),
  UNIQUE KEY `e-mail` (`e-mail`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;

CREATE TABLE IF NOT EXISTS `grupo` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `aula` varchar(25) COLLATE latin1_spanish_ci NOT NULL,
  `horario` int(10) NOT NULL,
  `ciclo` enum('1','2') COLLATE latin1_spanish_ci NOT NULL,
  `year` year(4) NOT NULL,
  `materia` int(10) NOT NULL,
  `docente` varchar(10) COLLATE latin1_spanish_ci NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`docente`) REFERENCES `docente`(`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (`horario`) REFERENCES `horario`(`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (`materia`) REFERENCES `materia`(`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `notas` (
  `id` int(15) NOT NULL AUTO_INCREMENT,
  `alumno` varchar(10) COLLATE latin1_spanish_ci NOT NULL,
  `grupo` int(10) NOT NULL,
  `com1lab1` decimal(4,2) NOT NULL DEFAULT '0.00',
  `com1lab2` decimal(4,2) NOT NULL DEFAULT '0.00',
  `com1par` decimal(4,2) NOT NULL DEFAULT '0.00',
  `com2lab1` decimal(4,2) NOT NULL DEFAULT '0.00',
  `com2lab2` decimal(4,2) NOT NULL DEFAULT '0.00',
  `com2par` decimal(4,2) NOT NULL DEFAULT '0.00',
  `com3lab1` decimal(4,2) NOT NULL DEFAULT '0.00',
  `com3lab2` decimal(4,2) NOT NULL DEFAULT '0.00',
  `com3par` decimal(4,2) NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`id`),
  FOREIGN KEY (`alumno`) REFERENCES `alumno`(`codigo`) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (`grupo`) REFERENCES `grupo`(`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci AUTO_INCREMENT=1 ;

Postdata: Con lo del LEFT JOIN ya busqué sobre eso pero no termino de entender como se usaría en este caso, si me pudieran dar un ejemplo seria perfecto


Desconectado Non Servium

  • Trade Count: (0)
  • Sv Member
  • ***
  • Thank You
  • -Given: 6
  • -Receive: 39
  • Mensajes: 425
  • Ilix Punx :)
Re:[Pregunta] Consulta a multiples tablas en MySQL
« Respuesta #5 : abril 26, 2012, 03:06:42 pm »
Tu estructura está bastante rara... pero podes tomar el ejemplo aplicando lo siguiente:

Código: [Seleccionar]
SELECT `notas`.`alumno`, `materia`.`nombre` AS materia,
(`notas`.`com1lab1`*0.3)+(`notas`.`com1lab2`*0.3)+(`notas`.`com1par`*0.4) AS 'computo 1',
(`notas`.`com2lab1`*0.3)+(`notas`.`com2lab2`*0.3)+(`notas`.`com2par`*0.4) AS 'computo 2',
(`notas`.`com3lab1`*0.3)+(`notas`.`com3lab2`*0.3)+(`notas`.`com3par`*0.4) AS 'computo 3'
FROM `grupo` INNER JOIN `materia`
ON `grupo`.`materia` = `materia`.`id`
INNER JOIN `notas` ON `grupo`.`id` = `notas`.`grupo`
WHERE `notas`.`alumno` = 'smis052211'

deberías ver algunos tutoriales de normalización de tablas xq me costo entenderte  :thumbsup:
Follow members gave a thank to your post:
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch

Desconectado 0rion

  • Trade Count: (0)
  • MiembrosReales
  • *
  • Thank You
  • -Given: 7
  • -Receive: 0
  • Mensajes: 46
Re:[Pregunta] Consulta a multiples tablas en MySQL
« Respuesta #6 : abril 26, 2012, 03:17:25 pm »
Gracias bereco, esto me sirvió, te molestaría mucho con que me explique aunque sea vagamente como funciona? Y en cuanto a la normalización, en eso estoy, ya he cambiado la estructura de la BD's varias veces pero siempre me vuelvo a encontrar conque mi enfoque no es el adecuado, la revisaré mas a fondo. :phew:


Desconectado Non Servium

  • Trade Count: (0)
  • Sv Member
  • ***
  • Thank You
  • -Given: 6
  • -Receive: 39
  • Mensajes: 425
  • Ilix Punx :)
Re:[Pregunta] Consulta a multiples tablas en MySQL
« Respuesta #7 : abril 26, 2012, 03:44:53 pm »
Gracias bereco, esto me sirvió, te molestaría mucho con que me explique aunque sea vagamente como funciona? Y en cuanto a la normalización, en eso estoy, ya he cambiado la estructura de la BD's varias veces pero siempre me vuelvo a encontrar conque mi enfoque no es el adecuado, la revisaré mas a fondo. :phew:
Va tomando un ejemplo muy sencillo y bastante entendible, podría explicarte las consultas hacia las tablas Region, Departamento y Municipio...
Ya sabemos la jerarquía que tienen ellas, así que por eso es facil entender.

Tablas

Region
    Id_Region INT PRIMARY
    NombreRegion VARCHAR(20)

Departamento
    Id_Departamento INT PRIMARY
    Id_Region INT FOREIGN
    NombreDepartamento

Municipio
    Id_Municipio INT PRIMARY
    Id_Departamento INT FOREIGN
    NombreMunicipio

básicamente INNER JOIN se utiliza para enlazar tablas y tiene de escenario o cojunto o dimensión la tabla hija (detalles) en este caso, Municipio.
Se utiliza siempre una clausula ON luego de escribir la tabla (FROM [Tabla_01] INNER JOIN [Tabla_02] ON [Tabla_01].[CampoId] = [Tabla_02].[CampoFk])...
Existe LEFT JOIN, (LEFT OUTER JOIN, CROSS JOIN, RIGHT OUTER JOIN, RIGHT JOIN) que también relacionan tablas pero tomando en cuenta aquellos registros que tienen el campo de llave foránea NULL de un lado (LEFT), del otro (RIGHT) o de ambos (CROSS)

Ejemplo:

Código: [Seleccionar]
SELECT R.NombreRegion, D.NombreDepartamento, M.NombreMunicipio
FROM Region AS R
INNER JOIN Departamento AS D
ON R.Id_Region = D.Id_Region
INNER JOIN Municipio AS M
ON D.Id_Departamento = M.Id_Departamento
Follow members gave a thank to your post:
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch

Desconectado tekun

  • -^- Elite Silver -^-
  • Trade Count: (1)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 101
  • Mensajes: 3193
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re:[Pregunta] Consulta a multiples tablas en MySQL
« Respuesta #8 : abril 27, 2012, 01:25:19 pm »
Tablas

Region
    Id_Region INT PRIMARY
    NombreRegion VARCHAR(20)

Departamento
    Id_Departamento INT PRIMARY
    Id_Region INT FOREIGN
    NombreDepartamento

Municipio
    Id_Municipio INT PRIMARY
    Id_Departamento INT FOREIGN
    NombreMunicipio

Ejemplo:

Código: [Seleccionar]
SELECT R.NombreRegion, D.NombreDepartamento, M.NombreMunicipio
FROM Region AS R
INNER JOIN Departamento AS D
ON R.Id_Region = D.Id_Region
INNER JOIN Municipio AS M
ON D.Id_Departamento = M.Id_Departamento

mismo resultado otro script

SELECT R.NombreRegion, D.NombreDepartamento, M.NombreMunicipio
FROM Region AS R, Departamento AS D, Municipio AS M
where D.Id_Departamento = M.Id_Departamento
and  R.Id_Region = D.Id_Region



Quiero agregar dos cosas.... la primera y la que ya he dicho varias veces, es que todo lo que tiene que ver con ** JOINS ** NO ES LO MEJOR

la segunda es un gran offtopic, pero es interesante, sobre el tipo de estructura en las tablas de Departamento y Municipios... yo he acostumbrado a diseñar las relaciones de forma distinta.. no se como llamarle porque no he aprendido por la teoria de una U, sino por "buenas prácticas"

por tu diseño, puedo deducir, que el campo Id_Departamento es un autoincrementable de "1 - 100000" que no se repite...
yo acostumbro a que mi llave principal se conforma con la qué, a la véz, se vuelve llave foránea, así:


Region
    Id_Region INT PRIMARY
    NombreRegion VARCHAR(20)

Departamento 
    Id_Region INT
    Id_Departamento INT
    NombreDepartamento
 pkey{Id_Region,Id_Departamento)
 fkey{Id_Region } reference Region
Municipio
    Id_Region INT
    Id_Departamento INT
    Id_Municipio INT
    NombreMunicipio
 pkey{Id_Region,Id_Departamento,Id_Municipio)
 fkey{Id_Region,Id_Departamento } reference Departamento

con eso logro algo así:
Region
Id_Region  Region
1              el salvador
2              ee uu

Departamento
Id_Region  Id_Departamento   Departamento
1              1                           La paz
2              1                           Guachinton

Municipio

Id_Region  Id_Departamento   Id_Municipio      Municipio
1              1                           1                     Zacate
2              1                           1                     Alaska

Follow members gave a thank to your post:
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado Juancho

  • Trade Count: (2)
  • The Communiter-
  • *
  • Thank You
  • -Given: 12
  • -Receive: 16
  • Mensajes: 1309
Re:[Pregunta] Consulta a multiples tablas en MySQL
« Respuesta #9 : abril 28, 2012, 02:53:13 pm »
la segunda es un gran offtopic, pero es interesante, sobre el tipo de estructura en las tablas de Departamento y Municipios... yo he acostumbrado a diseñar las relaciones de forma distinta.. no se como llamarle porque no he aprendido por la teoria de una U, sino por "buenas prácticas"
por tu diseño, puedo deducir, que el campo Id_Departamento es un autoincrementable de "1 - 100000" que no se repite...
yo acostumbro a que mi llave principal se conforma con la qué, a la véz, se vuelve llave foránea, así:


Saludos Tekun, tiempos de no saludarte aqui por la comunidad, agregando un poquito al tema, hace unos años atras, discutiamos con un amigo mio sobre que diseño estaba bueno, Si las llaves foraneas se convierten en llaves primarias de la tabla en las relaciones de las entidades(tambien conocido por su nombre "Relacion de Dependencia" o si la llave foranea pasa a ser un atributo mas de la entidad y creamos un nuevo atributo como llave primaria.

Bueno al final de aquel dia concluimos q los 2 estaban buenos. Hoy en dia con lo q uno aprende con el dia a dia, puedo concluir en lo siguiente:
Todo depende, nunk he visto bueno de avisar de las Relaciones de Dependencia, al menos en mi caso, normalmente hago uso de las relaciones de dependencia cuando hay asociaciones entre ambas entidades, o en algunas Especializaciones/Generalizaciones de mi Modelo Conceptual. Luego en las demas relaciones es de evaluar, pero como que queda a criterio de cada diseñador, al menos hace poco trabajaba en una BD dond tenia una relacion de grado 3 (3 entidades), y a la hora de realizar las consulta se volvia un poco complicado al manejar los 3 atributos llevarlos siempre, asi q mejor cambie esa relacion, coloque una restriccion en la cual cumpla q no se puedan repetir esos cambos, y el ID no es un AutoNumerico, sino que es un Atributo Calculado, de la cual a partir de los codigos de las 3 entidades se coforma el nuevo atributo, de esa manera se puede cumpli la Restriccion de Integridad de la Entidad.
<a href="http://www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/" target="_blank">
<img src="http://cache.www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/b_560x95.png" border="0" width="560" height="95" alt="" />
</a>

Desconectado tekun

  • -^- Elite Silver -^-
  • Trade Count: (1)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 101
  • Mensajes: 3193
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re:[Pregunta] Consulta a multiples tablas en MySQL
« Respuesta #10 : abril 30, 2012, 09:17:20 am »
que ondas Juancho.... puia deberás que ha pasado largo rato.... saludos mi hermanito.

lo que define el camino a seguir, a la hora de implementar un diseño, es el tipo de información(logica de los datos) que se guardarán en las tablas... y en este caso de las direcciones es fácil de entender....

imaginate a un usuario... creando departamentos... partiendo del diseño que explique... y que las regiones, se vuelven paises... imaginate que queres crear un nuevo departamento (partiendo que le ganamos los bolsones a los catrachos) lo que el usuario espera ver en el codigo de departamento es el número 15, pero si el campo codigo es un autoincrementable común, lo más seguro es que obtendras un número más alto..

entonces, hay ocasiones en donde debes seguir el camino sencillo y otras donde no tenes más que el "complicado" ya me ha tocado hacer escripts laaaaargos, para esta informacion geográfica... con 5 niveles... es una buena forma de aprender a scribir rápido lkajdfñlkajsfñl
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado Non Servium

  • Trade Count: (0)
  • Sv Member
  • ***
  • Thank You
  • -Given: 6
  • -Receive: 39
  • Mensajes: 425
  • Ilix Punx :)
Re:[Pregunta] Consulta a multiples tablas en MySQL
« Respuesta #11 : abril 30, 2012, 11:51:51 am »
Quiero agregar dos cosas.... la primera y la que ya he dicho varias veces, es que todo lo que tiene que ver con ** JOINS ** NO ES LO MEJOR

la segunda es un gran offtopic, pero es interesante, sobre el tipo de estructura en las tablas de Departamento y Municipios... yo he acostumbrado a diseñar las relaciones de forma distinta.. no se como llamarle porque no he aprendido por la teoria de una U, sino por "buenas prácticas"

por tu diseño, puedo deducir, que el campo Id_Departamento es un autoincrementable de "1 - 100000" que no se repite...
yo acostumbro a que mi llave principal se conforma con la qué, a la véz, se vuelve llave foránea, así:

Region
    Id_Region INT PRIMARY
    NombreRegion VARCHAR(20)

Departamento 
    Id_Region INT
    Id_Departamento INT
    NombreDepartamento
 pkey{Id_Region,Id_Departamento)
 fkey{Id_Region } reference Region
Municipio
    Id_Region INT
    Id_Departamento INT
    Id_Municipio INT
    NombreMunicipio
 pkey{Id_Region,Id_Departamento,Id_Municipio)
 fkey{Id_Region,Id_Departamento } reference Departamento

con eso logro algo así:
Region
Id_Region  Region
1              el salvador
2              ee uu

Departamento
Id_Region  Id_Departamento   Departamento
1              1                           La paz
2              1                           Guachinton

Municipio

Id_Region  Id_Departamento   Id_Municipio      Municipio
1              1                           1                     Zacate
2              1                           1                     Alaska

Tu concepto de estructura esta bueno, igual que el mio. Sin embargo, se utilizaría más el tuyo cuando utilizas una base indizada o limitada. Que de hecho ni tan limitada, ya que hace de cuenta y caso que necesites una entidad (Cliente) que tenga municipio, este debe tener Id_Region e Id_Departamento además en sus columnas xq la PK de TBL_Municipios lo exige y esto se vovería incomodo para un millon de clientes (por ejemplo)

En resumen, creo q tu ejemplo se acomoda más a unas tablas mas "consultables" (con constantes actualizaciones, índices y jerarquía en cascada).
el mio, creo q se acomoda más a tablas relacionales (con jerarquia múltiple, a veces datos fijos) y depende del escenario es bueno decidir entre estos dos antes de definir lo demás.  :thumbsup:
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch