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

duda con los joins

Estas en el tema de duda con los joins en el foro de Mysql en Foros del Web. hola a todos, la verdad soy inexperto en esto de los joins de mysql mi situación es la siguiente: tengo unas tablas alumnos idalu |nombre ...
  #1 (permalink)  
Antiguo 17/05/2012, 21:39
 
Fecha de Ingreso: mayo-2012
Ubicación: Queretaro
Mensajes: 1
Antigüedad: 12 años, 6 meses
Puntos: 0
Pregunta duda con los joins

hola a todos, la verdad soy inexperto en esto de los joins de mysql
mi situación es la siguiente:

tengo unas tablas

alumnos
idalu |nombre |grupo
1 |alu1 | g1
2 |alu2 |g2
3 |alu3 |g1
4 |alu4 |g1

materias
idmat |descripcion
1 |matematicas
2 |español


calificaciones
idalu |idmat |calificacion
1 |1 |10
3 |1 |9
1 |2 |6.7
4 |2 |5

como hacer una cosulta para obtener los todos alumnos del grupo (g1) con sus
calificaciones de la materia de matematicas (1)
quiero que la consulta me arroje los siguientes resultados:

nombre descripcion calificacion
alu1 |matematicas |10
alu3 |matematicas |9
alu4 |matematicas |NULL

Alguna ayuda?, las consultas son mas grandes pero creo que este pequeño ejemplo
me serviría para darme una "luz".
Gracias por su atención.
  #2 (permalink)  
Antiguo 18/05/2012, 01:35
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: duda con los joins

No se hacen tareas escolares....

La solución es esta

SELECT ....
FROM
(Tabla1 T1 LEFT JOIN Tabla2 T2 ON T1.idT1=T2.idT1)
INNER JOIN Tabla3 T3 ON T2.idT3=T3.idT3
WHERE ...

Manual 13.2.7.1. Sintaxis de JOIN
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 20/05/2012, 14:45
Avatar de gerardo_goh  
Fecha de Ingreso: noviembre-2008
Mensajes: 107
Antigüedad: 16 años
Puntos: 1
Respuesta: duda con los joins

hola quimfv:
Eres muy bueno, nos puedes guiar yo también tengo duda de como hacer este query,saludos!!!
  #4 (permalink)  
Antiguo 20/05/2012, 22:49
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 17 años, 8 meses
Puntos: 47
Respuesta: duda con los joins

Hola mira te dejo esta consulta que funciona, lo unico que no he logrado es que traiga las calificaciones cuando estas son nulas, quiza alguien con mas cerebro que yo lo pueda hacer jeje

Código MySQL:
Ver original
  1. SELECT alumnos.idAlumno, alumnos.nombre, calificaciones.calificacion, materias.descripcion
  2. FROM (alumnos LEFT JOIN calificaciones ON alumnos.idAlumno=calificaciones.idAlumno)
  3. LEFT JOIN materias ON calificaciones.idMateria=materias.idMateria
  4. WHERE alumnos.grupo='g1';

Saludos
  #5 (permalink)  
Antiguo 20/05/2012, 23:27
Avatar de gerardo_goh  
Fecha de Ingreso: noviembre-2008
Mensajes: 107
Antigüedad: 16 años
Puntos: 1
Respuesta: duda con los joins

tengo el siguiente la siguiente respuesta creo que esta bien.

create table tblalumnos(idalumno integer null,
nombre varchar(15) null,
grupo varchar(5) null);

create table tblmaterias(idmateria integer null,
descripcion varchar(15) null);

create table tblcalificaciones(idalumno integer null references tblalumnos (idalumno),
idmateria integer null references tblmaterias (idmateria),
calificacion decimal(8,2) null);


insert into tblalumnos(idalumno,nombre,grupo)
values (1,'jorge','G1'),
(2,'julio','G2'),
(3,'oscar','G1'),
(4,'ricardo','G1');


insert into tblmaterias(idmateria,descripcion)
values (1,'matematicas'),
(2,'ingles');

insert into tblcalificaciones(idalumno,idmateria,calificacion)
values (1,1,10),
(3,1,9),
(1,2,6.7),
(4,2,5),
(2,1,9.8);

-- query para cuando es para una materia en especifico --
select x.nombre,y.calificacion,z.descripcion from tblalumnos x
inner join tblcalificaciones y on x.idalumno=y.idalumno
inner join tblmaterias z on y.idmateria=z.idmateria
where y.idmateria=1;


-- para cuando quieres saber de un grupo en especial --
select x.nombre,z.calificacion from tblalumnos x
left join (select * from tblcalificaciones) z on x.idalumno=z.idalumno
where x.grupo ='G2' and z.idalumno is not null and z.idmateria=1
group by x.nombre;


Si algo esta mal espero que me orientes, Saludos!!!

Última edición por gerardo_goh; 20/05/2012 a las 23:32
  #6 (permalink)  
Antiguo 21/05/2012, 01:32
 
Fecha de Ingreso: mayo-2012
Mensajes: 42
Antigüedad: 12 años, 6 meses
Puntos: 5
Respuesta: duda con los joins

Hola djaevi,

Utilizando un left join no te va a mostrar los nulos, prueba con un inner join:

Código SQL:
Ver original
  1. SELECT alumnos.nombre,materias.descripcion,calificaciones.calificacion FROM calificaciones
  2. INNER JOIN alumnos ON alumnos.idalu=calificaciones.idalu
  3. INNER JOIN materias ON calificaciones.idmat=materias.idmat;

Ponle un where si quieres solo los del g1 ... etc

Échale un ojo a http://dev.mysql.com/doc/refman/5.0/en/join.html

¡Un saludo!

Última edición por davikt; 21/05/2012 a las 01:38
  #7 (permalink)  
Antiguo 21/05/2012, 02:40
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: duda con los joins

poner esto

select * from tblcalificaciones

o directamente la tabla es lo mismo.

A INNER JOIN B muestra solo los pares de registros en que el campo de relacion son iguales, en el caso de alumnos y notas de una materia mostrará solo los alumnos que tengan nota en esa materia. Si no se filtra por materia mostrará todos los alumnos que tengan ALGUNA nota, NO mostrará alumnos que no tengan notas.

INNER JOIN los alumnos con ALGUNA nota

INNER JOIN + WHERE idMateria=1 solo los alumnos que tengan nota en matematicas...

A LEFT JOIN B muestra TODOS los registros de A tengan o no pareja en B, en el caso de los alunos y materias si filtramos por materia (tabla B), mostrará los alumnos que tengan nota en esa materia. Si filtramos por grupo (tabla A) mostrará todos los alumnos de el grupo tengan o no notas.... Si no se filtra por nada mostrá TODOS los alumnos tengan o no notas.

LEFT JOIN TODOS los alumnos tengan o no notas (con sus notas)

LEFT JOIN + WHERE grupo="G1" TODOS los alumnos de G1 tengan o no notas

LEFT JOIN + WHERE grupo="G1" AND idMateria=1 TODOS los alumnos de G1 que tengan nota de matematicas

LEFT JOIN + WHERE idMateria=1 TODOS los alumnos que tengan nota de matematicas (igual que el INNER)

Luego al contrario de lo que se ha dicho si se quiere todos los alumnos de un grupo se tiene que utilizar left join. Pero si ademas de filtrar por grupo tambien se filtra por materia y queremos los nulos se debe agregar una condicion OR....

LEFT JOIN + WHERE a.grupo="G1" AND (n.idmateria=1 OR n.idmateria IS NULL)
Esto dará TODOS los alumnos del grupo G1 y su nota de matematicas (aun que no tengan)

Espero un % de la nota que saquen!!!!
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Etiquetas: join, joins, 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 22:31.