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

consulta con join y tabla intermedia

Estas en el tema de consulta con join y tabla intermedia en el foro de Mysql en Foros del Web. Hola, estoy empezando con sql y no consigo hacer una consulta entre dos tablas relacionadas con una tabla intermedia, os pongo la consulta que estoy ...
  #1 (permalink)  
Antiguo 07/04/2013, 07:15
 
Fecha de Ingreso: abril-2013
Ubicación: Madrid
Mensajes: 12
Antigüedad: 11 años
Puntos: 0
Pregunta consulta con join y tabla intermedia

Hola, estoy empezando con sql y no consigo hacer una consulta entre dos tablas relacionadas con una tabla intermedia, os pongo la consulta que estoy intentando hacer y a ver que me contáis...

tengo tres tablas

entrevistas
------------------
id_entrevista
nombre
apellido
fecha

curriculum
------------------
id_curriculum
nombre
tamaño
extension
archivo

entrevista_cv
-------------------
id_entrevista
id_cv

estas son mis tres tablas, y estoy intentando sacar los datos de cada entrevista con cada archivo de la tabla curriculum, estoy intentando esto, pero no me sale.

SELECT * FROM entrevistas
LEFT JOIN relaciones ON entrevista_cv.id_entrevista = entrevistas.id_entrevista
LEFT JOIN curriculum ON entrevista_cv.cv = curriculum.id_curriculum

a ver si me podeis echar una mano, que tengo la cabeza loca con esto jejeje
  #2 (permalink)  
Antiguo 07/04/2013, 08:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: consulta con join y tabla intermedia

En primera instancia, tienes que tener en cuenta que el LEFT JOIN, por sus características, puede ser algo traicionero si no se lo entiende bien.
LEFT JOIN devuelve todo lo de la primera tabla (izquierda), junto con lo de la segunda relacionado con ella y NULL donde no encuentre registros relacionables con esa segunda.
Esto implica al menos dos cosas:
1) Si relacionas la primera tabla con la segunda, y luego la primera con la tercera, generarás un producto cartesiano. Es un caso de relaciones en estrella y es un defecto de construcción de la consulta.
2) Toda relación entre más de dos tablas debe ser en cadena (como la pusiste tu), pero debes recordar que si el resultado de la segunda tabla en un registro es NULL, no devolverá registros en la tercera relacionados, porque no se puede relacionar NULL con una tabla.

En definitiva, si la relación es obligatoria, no tiene sentido usar LEFT JOIN, porque te devolverá relaciones nulas y curriculums nulos si no hay relaciones dadas con la primera tabla.

La consulta que pones está relativamente bien, aunque si lo que quieres es sólo los casos relacionados, debes usar INNER y no LEFT.
Código MySQL:
Ver original
  1. FROM entrevistas E
  2.     INNER JOIN relaciones R ON E.id_entrevista = R.id_entrevista
  3.     INNER JOIN curriculum C ON R.cv = C.id_curriculum

Técnicamente, es probable que el resultado sea el mismo, por lo que deberías aclararnos mejora qué te refieres con "no me sale"...
¿Qué es lo que no te sale?


PD: Es muy mala práctica poner "*" en consultas, especialmente cuando trabajas con tablas relacionadas, porque eso te devolverá todos los campos de todas las tablas al mismo tiempo, y no sólo es raro que los necesites todos, sino que además devolverá datos duplicados por repeticion de valores correspondientes a las FK.
Es mejor práctica especificar los campos que necesitas, y sólo esos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 08/04/2013, 01:33
 
Fecha de Ingreso: abril-2013
Ubicación: Madrid
Mensajes: 12
Antigüedad: 11 años
Puntos: 0
Respuesta: consulta con join y tabla intermedia

Pongo exactamente las tablas, la consulta y el error, que ayer, no tenia el codigo delante, seguro que es una tonteria, pero no doy con ello.

TABLAS

v rechum.entrevistas
id_entrevista : int(11)
nombre : text
apellido1 : text
apellido2 : text
fecha1 : date
entrevistador1 : text
decision1 : text
fecha2 : date
entrevistador2 : text
decision2 : text
cv : mediumblob
departamento : varchar(10

v rechum.entrevistas_cv
id_entrevista : int(11)
id_cv : int(11)

v rechum.tbl_documentos
id_documento : int(11)
titulo : varchar(150)
descripcion : mediumtext
contenido : longblob
tamanio : int(11)
tipo : varchar(150)
nombre_archivo : varchar(255)
tamanio_unidad : varchar(150)

Esta es mi consulta:
Código:
SELECT * FROM tbl_documentos WHERE entrevistas.id_entrevista='$id' 
     INNER JOIN entrevistas_cv.id_entrevista=entrevistas.id_entrevista 
     INNER JOIN entrevistas_cv.id_cv=tbl_documentos.id_documento
y esto es lo que me da:
Código:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN entrevistas_cv.id_entrevista=entrevistas.id_entrevista INNER JOIN ent' at line 1 qry: SELECT * FROM tbl_documentos WHERE entrevistas.id_entrevista='85' INNER JOIN entrevistas_cv.id_entrevista=entrevistas.id_entrevista INNER JOIN entrevistas_cv.id_cv=tbl_documentos.id_documento
  #4 (permalink)  
Antiguo 08/04/2013, 03:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: consulta con join y tabla intermedia

Bueno, en realidad, es fácil de ver el error. Me sorprende que no lo notes tu mismo.
Esto es lo que escribiste:
Código MySQL:
Ver original
  1. SELECT * FROM tbl_documentos
  2. WHERE entrevistas.id_entrevista='$id'
  3. INNER JOIN entrevistas_cv.id_entrevista=entrevistas.id_entrevista
  4. INNER JOIN entrevistas_cv.id_cv=tbl_documentos.id_documento
Y esto es lo que yo te puse de ejemplo (agregando un filtro para el ID en una de las tablas):
Código MySQL:
Ver original
  1. FROM entrevistas E
  2.     INNER JOIN relaciones R ON E.id_entrevista = R.id_entrevista
  3.     INNER JOIN curriculum C ON R.cv = C.id_curriculum
  4. WHERE R.id = $id

¿Notas la diferencia de sintaxis?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: join, select, 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 06:27.