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

Relacionar tablas

Estas en el tema de Relacionar tablas en el foro de Mysql en Foros del Web. Buenas, es mi primer post y primero quisiera agradecer en general a todos los que escribís en esta web por que siempre encuentro algo que ...
  #1 (permalink)  
Antiguo 02/10/2012, 06:00
 
Fecha de Ingreso: septiembre-2012
Mensajes: 3
Antigüedad: 11 años, 7 meses
Puntos: 0
Relacionar tablas

Buenas, es mi primer post y primero quisiera agradecer en general a todos los que escribís en esta web por que siempre encuentro algo que me sirve cuando voy desarrollando mis aplicaciones web.

Bueno entrando al problema que tengo es que necesito relacionar 3 tablas hasta ahí mas o menos me aclaro

El problema viene y aquí empiezo a explicar un poco la base de datos.

Es un software para el control de practicas que hace un alumno en un curso.

Tengo una tabla que define las practicas que tiene que hacer un alumno, es decir esta tabla almacena datos el id de la practica el nombre y los objetivos.

Otra tabla almacena si la practica se ha completado y esta aprobada por cada alumno, es decir almacena el id de la practica el id del alumno y 0 si esta aprobada y 1 si la ha suspendido.

y por ultimo la tercera es la tabla con los datos del alumno.

el problema me lo encuentro al relacionar la tabla 1 y 2 ya que si la 1 tabla fuera para un alumno solo no hay problema pq usando left join me daría NULL a las no realizadas y se acabo.

pero cuando hay algún alumno que ya ha realizado esa practica no da NULL y necesito obtener las practicas que salen como 0 o directamente no han sido creadas en la 2 tabla.

había pensado hacerlo usando NOT IN como condición WHERE y y así funciona pero el script a la que le metes alguna relación se vuelve excesivamente lento.

Alguno se le ocurre como hacerlo.

Código PHP:
SELECT 
   practica
.practica
FROM 
   practica
WHERE 
   idpractia NOT IN 
(
         
SELECT
              idpractica 
         FROM 
              practica_completadas 
         WHERE 
              completada 
and idstudent 514
    

  #2 (permalink)  
Antiguo 02/10/2012, 06:20
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Relacionar tablas

Practicas
idPractica
nombrePractica
...

PracticasCompletadas
idPracticaCompletada
idPractica
idAlumno
convocatoria
nota
...
(he incluido convocatoria para que un alumno pueda repetir una practica)

No se si es esto lo que pides

Código MySQL:
Ver original
  1. SELECT p.nombrePractica, pc.convocatoria, pc.nota
  2. FROM practicas p LEFT JOIN practicascompletadas pc
  3.               ON p.idPractiac=pc.idPractica
  4. WHERE pc.idAlumno=514

Esto te dará una lista de TODAS las practicas con o sin convocatoria y nota del alumno 514. Cuando convocatoria y nota sean nulos es que 514 no ha hecho esa parctica...

Código MySQL:
Ver original
  1. SELECT p.nombrePractica, pc.convocatoria, pc.nota
  2. FROM practicas p LEFT JOIN practicascompletadas pc
  3.               ON p.idPractiac=pc.idPractica
  4. WHERE pc.idAlumno=514
  5.            and pc.idPractica IS NULL

esto te dará SOLO las parcticas que 514 no ha hecho.

Código MySQL:
Ver original
  1. SELECT p.nombrePractica, pc.convocatoria, pc.nota
  2. FROM practicas p LEFT JOIN practicascompletadas pc
  3.               ON p.idPractiac=pc.idPractica
  4. WHERE pc.idAlumno=514
  5.            and (pc.nota IS NULL OR pc.nota=1)

esto lo que NO ha hecho o NO ha aprobado. Ojo con las convocatorias (repeticiones) pero como no se si lo estas usando no lo desarrollo.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 02/10/2012 a las 06:28
  #3 (permalink)  
Antiguo 02/10/2012, 18:31
 
Fecha de Ingreso: septiembre-2012
Mensajes: 3
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Relacionar tablas

La idea es la que describes y esto lo había hecho el problema está en que imagínate que el alumno 513 ha hecho la práctica 3 y el 514 no en la condición del segundo caso la práctica 3 no le sale a nadie porque no devuelve valor NULL con el left join!!! Ya que sí existe alguien que ha hecho la práctica 3


Muchas gracias de todas formas
  #4 (permalink)  
Antiguo 03/10/2012, 01:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Relacionar tablas

Pues tienes toda la razón....

Haz esto

Código MySQL:
Ver original
  1. SELECT p.practica,
  2.              sbc.nota
  3. FROM Practicas p
  4.              LEFT JOIN
  5.                   (SELECT PracticasCompletadas.idPractica,
  6.                          PracticasCompletadas.nota,
  7.                          PracticasCompletadas.idAlumno
  8.                      FROM PracticasCompletadas
  9.                      WHERE PracticasCompletadas.idAlumno=514) as sbc
  10.              ON p.idpractica=sbc.idpractica;

Así funciona no se si será suficientemente rapida...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 08/10/2012, 01:59
 
Fecha de Ingreso: septiembre-2012
Mensajes: 3
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Relacionar tablas

Me va perfecto!!! Muchas gracias!!! Sois unos cracks!!!

Etiquetas: join, relacionar, select, tabla, tablas
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:46.