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

Sentencia SQL

Estas en el tema de Sentencia SQL en el foro de Mysql en Foros del Web. Saludos a todos!!! Tengo un problemilla con una senctencia SQL un poquito compleja en mi opinion... La version de la BDD: MySQL 3.23.49-log Bien, 3 ...
  #1 (permalink)  
Antiguo 07/05/2009, 04:05
 
Fecha de Ingreso: abril-2009
Ubicación: Vitoria
Mensajes: 160
Antigüedad: 15 años
Puntos: 1
Sentencia SQL

Saludos a todos!!!

Tengo un problemilla con una senctencia SQL un poquito compleja en mi opinion...

La version de la BDD: MySQL 3.23.49-log

Bien, 3 Tablas mas una que sale de la relacion.

COLEGIO:
ID_Colegio, Nombre, Descrip

CURSO:
ID_Curso, Nombre, Descrip

ALUMNO:
ID_Alumno, Nombre, Apel, etc...

T_RELACION:
IDR_Colegio, IDR_Curos, IDR_Alumno.

(Asi en esta tabla de relacion tengo de cada alumno el colegio en el que estudia y el curso que esta estudiando, tambien la puedo utilizar para saber en cada colegio que cursos hay.)

Bien quiero sacar cada alumno en el colegio que estudia y el curso en el que esta actualmente.

Yo voy por este camino pero no se si es muy correcto.

Código:
SELECT T_RELACION.IDR_Alumno, ...los demas datos del alumno desde tabla alumno.., CURSO.Nombre, COLEGIO.Nombre
FROM ALUMNO, COLEGIO, CUROS, T_RELACION
WHERE ALUMNO.ID_Alumno = (SELECT IDR_Alumno FROM T_RELACION)
AND COLEGIO.ID_Colegio = (SELECT IDR_Colegio FROM T_RELACION)
AND CUROS.ID_Curso = (SELECT IDR_Curso FROM T_RELACION)
Me estoy volviendo un poco loco!!

Gracias a todos por vuestra colaboracion!
  #2 (permalink)  
Antiguo 07/05/2009, 09:03
Avatar de cala932  
Fecha de Ingreso: septiembre-2006
Ubicación: San Juan-Argentina
Mensajes: 902
Antigüedad: 17 años, 7 meses
Puntos: 9
Respuesta: Sentencia SQL

Holas prueba esto:

Código:
 SELECT * FROM T_RELACION tr JOIN CURSO c ON tr.IDR_Curso = c.ID_Curso JOIN COLEGIO col ON tr.IDR_Colegio = col.ID_Colegio JOIN ALUMNO al ON tr.ID_Alumno = al.ID_Alumno
Espero que te sirva

Saludos
__________________
->Aprender es un proceso que incluye el error..
  #3 (permalink)  
Antiguo 08/05/2009, 03:13
 
Fecha de Ingreso: abril-2009
Ubicación: Vitoria
Mensajes: 160
Antigüedad: 15 años
Puntos: 1
Respuesta: Sentencia SQL

Me da un error... estoy poniendo la sintaxis mal o algo pasa pero... todo el rato lo mismo, y con las sentencias que estoy haciendo de prueba lo mismo!!!

Código SQL:
Ver original
  1. SELECT * FROM relation rt JOIN study st ON rt.IDR_Study = st.ID_Study JOIN school sh ON rt.IDR_School = sh.ID_School JOIN student su ON rt.IDR_Student = su.ID


You have an error in your SQL syntax near
'ON rt.IDR_Study = st.ID_Study JOIN school sh ON rt.IDR_School = sh.ID_School JOI' at line 1
  #4 (permalink)  
Antiguo 08/05/2009, 05:05
Avatar de cala932  
Fecha de Ingreso: septiembre-2006
Ubicación: San Juan-Argentina
Mensajes: 902
Antigüedad: 17 años, 7 meses
Puntos: 9
Respuesta: Sentencia SQL

Hola tokero puedes colocar las estructuras de las tablas tal cual las tienes, porque veo que en tu consulta no aparece como lo pusiste al principio. En base a las tablas que colocaste al principio esta consulta esta bien hecha.

SELECT * FROM T_RELACION tr JOIN CURSO c ON tr.IDR_Curso = c.ID_Curso JOIN COLEGIO col ON tr.IDR_Colegio = col.ID_Colegio JOIN ALUMNO al ON tr.ID_Alumno = al.ID_Alumno

Postea las estructuras asi podemos ayudarte mejor, te parece.

Saludos
__________________
->Aprender es un proceso que incluye el error..
  #5 (permalink)  
Antiguo 08/05/2009, 05:29
 
Fecha de Ingreso: abril-2009
Ubicación: Vitoria
Mensajes: 160
Antigüedad: 15 años
Puntos: 1
Respuesta: Sentencia SQL

Ok cala, pero tengo un lio montado entre tablas y campos de cada tabla... que ya estoy dudando de que la base de datos tenga las relaciones correctamente!!!

Como las tablas estan en ingles preferi ponerlas en castellano para que se entendiera mejor, pero hay van...

school:
ID_School, Sch_Name, Sch_Descrip

study:
ID_Study, Name, Description

relation - Nace de la relacion m/n entre school y study
IDR_School, IDR_Study

student - Relacionada con la tabla relation 1/n
ID, F_Name, L_Name, FK_School, FK_Study


El problema de esta base de datos, es que necesito saber tambien de cada "School" que "Studies" ofrece.
De hay la tabla - relation -
Una vez definido esto, solo necesito relacionar el "student" con el campo de esta tabla que contenga el "School" y el "Study" correspondiente.

Repito el objetivo de la sentencia SQL por si acaso...

Conseguir los datos de todos los alumnos "students" visualizando tambien que estan estudiando "study" y en que colegio "school"
  #6 (permalink)  
Antiguo 08/05/2009, 18:21
Avatar de cala932  
Fecha de Ingreso: septiembre-2006
Ubicación: San Juan-Argentina
Mensajes: 902
Antigüedad: 17 años, 7 meses
Puntos: 9
Respuesta: Sentencia SQL

Holas tokero analizando bien la base de datos no esta bien armada, aca te dejo un script de como deberia ser realmente la estructura de tu base suponiendo que la base de datos se llame universidad:
Te explico lo siguiente, de esta manera logras mantener la relacion de que estudios osea materias hay en cada colegio y por el otro lado la relacion de que materias esta cursando cada estudiante en que colegio. Como las tenias planteadas antes, la tabla estudiantes deberia repetir un registro por cada colegio y materia cursada, o en su defecto el id del estudiante deberia estar en la tabla relacion, pero puede darse el caso de que exista una materia en ese colegio y no tenga estudiantes asignados por lo que el id del estudiante en ese caso deberia aceptar valores nulos en la tabla relacion. Entonces para asegurar la integridad de los datos te propongo esta estructura, la cual a su vez te facilitar futuras consultas.
Código:
CREATE SCHEMA IF NOT EXISTS `universidad` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `universidad`;

-- -----------------------------------------------------
-- Table `universidad`.`estudiante`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `universidad`.`estudiante` (
  `id_estudiante` INT NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NOT NULL ,
  `apellido` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id_estudiante`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `universidad`.`materia`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `universidad`.`materia` (
  `id_materia` INT NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NOT NULL ,
  `descripcion` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id_materia`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `universidad`.`colegio`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `universidad`.`colegio` (
  `id_colegio` INT NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id_colegio`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `universidad`.`colegio_materia`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `universidad`.`colegio_materia` (
  `id_colegio` INT NOT NULL ,
  `id_materia` INT NOT NULL ,
  PRIMARY KEY (`id_colegio`, `id_materia`) ,
  INDEX `fk_colegio_has_materia_colegio` (`id_colegio` ASC) ,
  INDEX `fk_colegio_has_materia_materia` (`id_materia` ASC) ,
  CONSTRAINT `fk_colegio_has_materia_colegio`
    FOREIGN KEY (`id_colegio` )
    REFERENCES `universidad`.`colegio` (`id_colegio` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_colegio_has_materia_materia`
    FOREIGN KEY (`id_materia` )
    REFERENCES `universidad`.`materia` (`id_materia` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);


-- -----------------------------------------------------
-- Table `universidad`.`estudiante_colegio_materia`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `universidad`.`estudiante_colegio_materia` (
  `id_estudiante` INT NOT NULL ,
  `id_colegio` INT NOT NULL ,
  `id_materia` INT NOT NULL ,
  PRIMARY KEY (`id_estudiante`, `id_colegio`, `id_materia`) ,
  INDEX `fk_estudiante_has_colegio_materia_estudiante` (`id_estudiante` ASC) ,
  INDEX `fk_estudiante_has_colegio_materia_colegio_materia` (`id_colegio` ASC, `id_materia` ASC) ,
  CONSTRAINT `fk_estudiante_has_colegio_materia_estudiante`
    FOREIGN KEY (`id_estudiante` )
    REFERENCES `universidad`.`estudiante` (`id_estudiante` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_estudiante_has_colegio_materia_colegio_materia`
    FOREIGN KEY (`id_colegio` , `id_materia` )
    REFERENCES `universidad`.`colegio_materia` (`id_colegio` , `id_materia` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);
Puedes agregar mas campos si lo deseas, espero que te sirva. Te envio a tu correo una imagen del diagrama.

Y para obtener los datos que deseas, utilizas la siguiente consulta:
Código:
SELECT * FROM estudiante es JOIN estudiante_colegio_materia ecm ON es.id_estudiante
= ecm.id_estudiante JOIN materia m ON ecm.id_materia = m.id_materia JOIN colegio col ON
col.id_colegio = ecm.id_colegio
Espero haberte ayudado.

Saludos


Saludos
__________________
->Aprender es un proceso que incluye el error..

Última edición por cala932; 08/05/2009 a las 19:33
  #7 (permalink)  
Antiguo 11/05/2009, 02:39
 
Fecha de Ingreso: abril-2009
Ubicación: Vitoria
Mensajes: 160
Antigüedad: 15 años
Puntos: 1
Respuesta: Sentencia SQL

Buenas cala932!

Muchisimas gracias por tu ayuda... esto es increible, has sacado completamente el modelo E/R de mi base de datos y encima tambien has sacado el codigo necesario para su creación y sus consultas...
Muchisimas gracias de verdad!!

Un pequenio inconveniente, estoy utilizando una versión de MySql un poco antigua (MySQL 3.23.49-log) y no puedo actualizar, porque no tengo ese derecho donde estoy trabajando...

Esta versión de la base de datos, no contiene el tipo de tablas InnoBD. Tendre que exigir la integridad de los datos mediante el codigo PHP que contendrá la página web.

Pero aun asi me estas ayudando muchisimo, ahora tengo el modelo de BDD correctamtente diseniado y espero poder llevarlo hacia adelante.

Ya tengo la creacion de las tablas hechas, pero en vez de InnoBD, son de tipo MyISAM.
Aun asi, he cambiado lo importante de cada sentencia SQL y no me ha dado ningun problema...

Bien, despes he intentado probar la consulta de seleccion que me has puesto, pero cuando llega al primer "ON" da error.

SQL-query :

Código SQL:
Ver original
  1. SELECT * FROM student st JOIN student_college_study scs ON st.id_student
  2. = scs.id_student JOIN study sy ON scs.id_study = sy.id_study JOIN college col ON
  3. col.id_college = scs.id_college LIMIT 0, 30

MySQL ha dicho:

Código SQL:
Ver original
  1. You have an error IN your SQL syntax near 'ON st.id_student
  2. = scs.id_student JOIN study sy ON scs.id_study = sy.id_study J' at line 1


Como ves he cambiado los atributos y nombres de las tablas, de castellano a ingles porque aqui necesitan que esten en ingles... no creo que tengas problemas para situarte en la consulta...

Puede deberse a problemas de la version que estoy utilizando???

Muchisimas gracias!!!

Última edición por tokero; 11/05/2009 a las 04:03 Razón: Pruebas con el codigo
  #8 (permalink)  
Antiguo 11/05/2009, 05:57
 
Fecha de Ingreso: abril-2009
Ubicación: Vitoria
Mensajes: 160
Antigüedad: 15 años
Puntos: 1
Respuesta: Sentencia SQL

LO TENGO!!

Muchisimas gracias cala932, porque sin tu ayuda no lo habria conseguido!!!

despues de estructurar la base de datos tal y como me has aconsejado y habiendo introducido algunas filas en cada una de las tablas, he empezado a probar la sentencia SQL

Como la que tu me habias dejado no funcionaba, me imagino que por la version de MySql... he empezado a probar.

Al final no era tan complicado

Código SQL:
Ver original
  1. SELECT DISTINCT student.f_name, student.m_name, student.l_name, student.place, student.YEAR, college.col_name, study.sy_name
  2. FROM student, study, college, study_college, student_college_study
  3. WHERE student.id_student = student_college_study.id_student
  4. AND student_college_study.id_college = study_college.id_college
  5. AND student_college_study.id_study = study_college.id_study
  6. AND study.id_study = study_college.id_study
  7. AND college.id_college = study_college.id_college

Ligar absolutamente todas las tablas, pero en vez de utilizando el JOIN he usado las clausulas WHERE de toda la vida y he ido igualando las claves de cada tabla!!

Un exito!! muchisimas gracias de nuevo cala932!!!!

Ahora lo unico que me preocupa es como mantener integridad referencial con tanto lio de tablas y creadas como MyISAM...
  #9 (permalink)  
Antiguo 11/05/2009, 10:56
Avatar de cala932  
Fecha de Ingreso: septiembre-2006
Ubicación: San Juan-Argentina
Mensajes: 902
Antigüedad: 17 años, 7 meses
Puntos: 9
Respuesta: Sentencia SQL

Buenas tokero me alegra haberte ayudado y que hayas resuelto el problema.

Saludos
__________________
->Aprender es un proceso que incluye el error..
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 05:28.