Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/12/2013, 19:44
annx10
 
Fecha de Ingreso: noviembre-2013
Mensajes: 13
Antigüedad: 11 años
Puntos: 0
Consulta con 4 tablas

En primer lugar, muchas gracias a todos por los excelentes aportes que ofrecéis a través de este foro, ya que son de gran ayuda a novatillos como yo.
La duda que os quiero plantear es sobre una consulta que necesito realizar sobre 4 tablas, pero que no me devuelve los resultados deseados. Intuyo que el problema son las relaciones establecidas entre las tablas, pero necesitaría la opinión de gente más experta que yo.

Veréis, tengo las siguientes cuatro tablas:

tabla USUARIOS, con los siguientes campos:
cod_usuario INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
apellidos VARCHAR(50),
login VARCHAR(10) NOT NULL UNIQUE, y varios campos más que no vienen al caso

tabla PRESTAMOS, con los siguientes campos:
cod_prestamo INT AUTO_INCREMENT PRIMARY KEY,
usuario INT NOT NULL,
FOREIGN KEY (usuario) REFERENCES usuarios (cod_usuario)
ON DELETE RESTRICT ON UPDATE RESTRICT,
fechaprest DATETIME NOT NULL,
tipo_prestamo ENUM('sala','externo') NOT NULL)";

TABLA 'TIENE' (Recoge los detalles de cada préstamo), con los siguientes campos:
prestamo INT NOT NULL,
FOREIGN KEY (prestamo) REFERENCES prestamos (cod_prestamo)
ON DELETE RESTRICT ON UPDATE RESTRICT,
ejemplar INT NOT NULL,
FOREIGN KEY (ejemplar) REFERENCES ejemplares (cod_ejemplar)
ON DELETE RESTRICT ON UPDATE RESTRICT,
libro INT NOT NULL,
FOREIGN KEY (libro) REFERENCES ejemplares (codigo_libro)
ON DELETE RESTRICT ON UPDATE RESTRICT,
devuelto TINYINT(1) DEFAULT 0,
fecha_dev DATETIME,
PRIMARY KEY(prestamo,ejemplar,libro))";

tabla SANCIONES, con los siguientes campos:
cod_sancion INT AUTO_INCREMENT PRIMARY KEY,
usuario INT NOT NULL,
FOREIGN KEY (usuario) REFERENCES usuarios (cod_usuario)
ON DELETE RESTRICT ON UPDATE RESTRICT,
prestamo INT NOT NULL,
FOREIGN KEY (prestamo) REFERENCES prestamos (cod_prestamo)
ON DELETE RESTRICT ON UPDATE RESTRICT,
fecha_sancion DATETIME NOT NULL,
importe INT NOT NULL,
pagada TINYINT(1) DEFAULT 0)

Lo que pretendo hacer es seleccionar aquellos usuarios que no tengan préstamos pendientes de devolver, y que tampoco tengan sanciones pendientes de pagar. Además, tampoco seleccionará al usuario cuya sesión está iniciada, que es el que está trabajando con la aplicación que utiliza esta base de datos. Para ello, tras darle muchas vueltas no lo he conseguido. En principio pensé en esta consulta:

Código MySQL:
Ver original
  1. SELECT u.cod_usuario cod_usuario, u.nombre nombre, u.apellidos apellidos, u.login login
  2. FROM sanciones s JOIN usuarios u
  3. ON s.usuario = u.cod_usuario
  4. JOIN prestamos p
  5. ON u.cod_usuario = p.usuario
  6. JOIN tiene t
  7. ON p.cod_prestamo = t.prestamo
  8. WHERE cod_usuario != ($_SESSION[cod_usuario]) AND (devuelto = 1) AND (pagada = 1)

¿Podéis echarme un cable?
Ahora que lo estoy pensando un poco más, después de estar toda la tarde machacándome (siempre después de un descanso se piensa mejor), aunque sólo mostrase los usuarios que no tengan préstamos o sanciones pendientes, sólo por el hecho de que aparezcan en dichas tablas, al ponerle RESTRICT en la definición de las claves externas no dejaría al usuario de la aplicación eliminar dichos usuarios. Tendría que ahondar un poco más, pero lo veo bastante enrevesado el tema.

Si alguien pudiera darme algunos consejos u orientaciones se lo agradezco de antemano.

Un saludo.

Última edición por gnzsoloyo; 02/12/2013 a las 03:12