MySQL - devolver varios valores

   
Vista:

devolver varios valores

Publicado por Daniel (4 intervenciones) el 13/02/2016 13:19:43
Muy buenas!

Necesito algo de ayuda para ejecutar una consulta con varias tablas.

Estoy montando una web de gestión para un colegio y lo que necesito es ver los emails de los profesores que imparten en la unidad de un alumno.

El alumno viene seleccionado desde una variable de sesión por su nombre [alumno_seleccionado].

Para eso tengo montadas 4 tablas, a ver si puedo simplificarlo un poco.

Login_profes

usuario_______email
carl__________xxx@uuur.com
maitt_________yay@yyyd.es
fert__________hur@yhss.net
isss_________miss@ygd.com


Alumnado

nombre_______Unidad
Carlos_________1ºA
Juan___________2ºA
Maite__________4ºC
Sara___________2ºB
Martin__________2ºA
Luis___________1ºB


Asignaturas

1ºA________1ºB_______1ºC_____
mates1A___mates1B___mates1C____
lengua1A__lengua1B___lengua1C___
plast1A____musica1B__musica1C____


Profesorado

mates1A___mates1B___mates1C___lengua1A___lengua1B___lengua1C___plast1A___musica1B___
carl________maitt_______fert________isss_______isss_________maitt_______fert______carl_____



Si por ejemplo la variable de sesión que viene de otra pagina es la del alumno Luis, que esta en 1ºB, las asignaturas de esa unidad son mates1B, lengua1B y música1B, por lo tanto los profesores que le dan clase a Luis son maitt, isss y carl.
necesitaría que me devuelva sus emails de la tabla login_profes.

manejando varias tablas me pierdo un poco, y mas cuando deben salir varios valores... Ojalá podas echarme una mano que llevo dos días con esto
Como hago la estructura del SELECT?

Una vez mas, gracias al foro de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

devolver varios valores

Publicado por Gonzalo (103 intervenciones) el 13/02/2016 15:48:01
Si lo que muestras como ejemplos, describen la estructura real de tus tablas, desde ya lo que tienes no es un problema de consultas. Lo que tienes es una base de datos muy, pero MUY mal diseñada.
La base, así como se ve, no sirve para hacer consultas. Así de simple.

Un sistema como el que planteas al principio requiere de tablas como:

Alumnos(id_alumno, nombre, apellido, documento...)
Profesores(id_profesor, username, nombre, apellido, e-mail, ...)
Asignaturas(id_asignatura, denominacion, ...)
Asignatura_correlatividad(id_asignatura, id_asig_Correlativ)
Cursos(id_curso, denominacion, ....)
profesores_asignaturas(id_profesor, id_asignatura)
cursos_asignaturas(id_curso, id_asignatura)
cursos_profesores_asignaturas(id_curso, id_profesor, id_asignatura)

Esto, por lo menos.
A partir de un esquema semejante al que describo (bosquejado a vuelo de pajaro), la consulta es posible. Pero si me base en TU esquema descripto, la consulta se vuelve complejísima, ineficiente, y basada en datos de altisima posibilidad de inconsistencias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

devolver varios valores

Publicado por Daniel (4 intervenciones) el 13/02/2016 17:08:59
Hola Gonzalo, gracias por responder,

es evidente que llevas toda la razón, entiendo que básicamente he cometido el error de colocar en el nombre de columnas, lo que quiero relacionar, y por lo tanto es imposible la búsqueda, he modificado las dos ultimas tablas, y quedan todas así.
Login_profes

usuario_______email

carl__________xxx@uuur.com
maitt_________yay@yyyd.es
fert__________hur@yhss.net
isss_________miss@ygd.com


Alumnado

nombre_______Unidad
Carlos_________1ºA
Juan___________2ºA
Maite__________4ºC
Sara___________2ºB
Martin__________2ºA
Luis___________1ºB


Asignaturas

Unidad___Asigantura1____Asignatura2___Asignatura3_
1ºA_______mates1A_______lengua1A_____plast1A___
1ºB_______mates1B_______lengua1B_____plast1B___
1ºC_______mates1C_______lengua1B_____plast1C___


Profesorado

Asignatura____usuario
mates1A______carl
mates1B______maitt
mates1C______fert
lengua1A______isss
lengua1B______isss
lengua1C______maitt
plast1A________fert
musica1B______carl


Es ahora posible? gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

devolver varios valores

Publicado por Gonzalo (103 intervenciones) el 13/02/2016 17:59:55
Esto sigue estando mal:
Asignaturas

Unidad___Asigantura1____Asignatura2___Asignatura3_
1ºA_______mates1A_______lengua1A_____plast1A___
1ºB_______mates1B_______lengua1B_____plast1B___
1ºC_______mates1C_______lengua1B_____plast1C__

La relación entre cursos y asignaturas no puede hacerse enununico registro. Debe haber un regiostro por cada par Curso/Asignatura/Dia
En otras palabras, la composicion de la cursada semana requiere de otra/s tabla/s adicional/es.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

devolver varios valores

Publicado por Daniel (4 intervenciones) el 13/02/2016 20:09:03
gggngnng!!!

como soy tan zote?
y así??

Asignaturas

Asignatura____Unidad
mates1A_______1ºA
lengua1A______1ºA
plast1A________1ºA
mates1B_______1ºB
lengua1B______1ºB
plast1B________1ºB
mates1C_______1ºC
lengua1C_______1ºC
plast1C________1ºC


Si no puede ser hace alguna sugerencia de estructura por favor.
muchísimas gracias por leerme
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

devolver varios valores

Publicado por Daniel (4 intervenciones) el 13/02/2016 21:46:19
Vale, creo que lo he conseguido con esa ultima tabla:

1
2
3
4
SELECT login_profes.usuario, login_profes.email
FROM login_profes, Alumnado, profesorado, asignaturas
WHERE asignaturas.asignatura = profesorado.asignatura AND asignaturas.Unidad = Alumnado.Unidad AND profesorado.usuario = login_profes.usuario AND Alumnado.Alumno = colname
ORDER BY login_profes.id DESC

colname es la variable de sesión que trae el nombre del alumno...

!!!!Funciona perfectamente!!!!

Gracias Gonzalo, me hubiese vuelto loco sin ti, un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

devolver varios valores

Publicado por Gonzalo (103 intervenciones) el 14/02/2016 01:56:44
Me alegra que resultara.

Ahora una última nota, sobre MySQL y optimización de consultas.
El parser de MySQL no optimiza adecuadamente las condiciones de JOIN cuando estas están en el WHERE. Es preferible no usar JOIN implícito (la coma), sino explícitos, que son optimizables a nivel parser. Además te recomiendo usar alias para las tablas cuando trabajes con JOIN, para evitar codificaciones confusas y difíciles de analizar.
También te recomiendo ordenar las tablas e una secuencia lógica. SI lo que deseas es sobre os profesores, esta debe ser la primera tabla, y en orden sucesivo todas las que se van encadenando, en el mismo orden de relaciones. Ayuda a tener una codificación limpia y fácil de revisar.
1
2
3
4
5
6
7
SELECT lp.usuario, lp.email
FROM profesorado pr
    INNER JOIN  login_profes LP ON pr.usuario =lp.usuario
    INNER JOIN asignaturas asig ON pr.asignatura = asig.asignatura
    INNER JOIN Alumnado AL ON asig.Unidad = al.Unidad
WHERE  al.Alumno = colname
ORDER BYlp.id DESC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar