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

[SOLUCIONADO] Inner Join

Estas en el tema de Inner Join en el foro de Mysql en Foros del Web. Buenos días espero puedan ayudarme tengo una consulta con inner join, no me manda error pero no me sale ningún registro y en las tablas ...
  #1 (permalink)  
Antiguo 25/10/2013, 09:33
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 10 años, 5 meses
Puntos: 0
Pregunta Inner Join

Buenos días espero puedan ayudarme tengo una consulta con inner join, no me manda error pero no me sale ningún registro y en las tablas relacionadas si tengo datos la consulta es la siguiente

Código MySQL:
Ver original
  1. SELECT area.Nombre as area, NomPuesto, NombreNivel, IdEmp,
  2. ClaveEmpleado, empleado.Nombre, APaterno, AMaterno, empleado.IdArea, empleado.IdPuesto,
  3. empleado.IdNivel, Usuario, Contrasena, Email, Foto
  4. FROM empleado
  5. INNER JOIN area ON area.IdArea=empleado.IdArea
  6. INNER JOIN puesto ON empleado.IdPuesto=puesto.IdPuesto
  7. INNER JOIN niveldeacceso ON empleado.IdNivel=niveldeacceso.IdNivel
  8. WHERE ClaveEmpleado='1000'

también lo realice de esta forma:

Código MySQL:
Ver original
  1. SELECT area.Nombre as area, NomPuesto, NombreNivel, IdEmp,
  2. ClaveEmpleado, empleado.Nombre, APaterno, AMaterno, empleado.IdArea, empleado.IdPuesto,
  3. empleado.IdNivel, Usuario, Contrasena, Email, Foto
  4. FROM empleado, area, puesto, niveldeacceso WHERE  area.IdArea=empleado.idarea
  5. AND puesto.idpuesto=empleado.idpuesto AND niveldeacceso.idnivel=empleado.idnivel
  6. AND ClaveEmpleado='1000'

y pasa lo mismo y no se que pueda ser, Ayuda porfavor

Última edición por gnzsoloyo; 25/10/2013 a las 09:42 Razón: Codigo sin etiquetar.
  #2 (permalink)  
Antiguo 25/10/2013, 09:43
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: Inner Join

Eso implica que no hay datos que cumplan con todas las condiciones al mismo tiempo.
Suprime el where y buca visualmenet.
__________________
¿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 25/10/2013, 10:37
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Inner Join

Hola gracias por responder a mi ayuda. Si quito el Where me manda todos los registros que hay en las tablas pero repetidos unos con otros y solo quiero que me de lo que corresponde a cada tabla dependiendo la ClaveEmpleado o una consulta general sin la condición, ouch =(

si le quito el where

SELECT area.Nombre as area, NomPuesto, NombreNivel, IdEmp,
ClaveEmpleado, empleado.Nombre, APaterno, AMaterno, empleado.IdArea, empleado.IdPuesto,
empleado.IdNivel, Usuario, Contrasena, Email, Foto
FROM empleado, area, puesto, niveldeacceso

e iwual en esta

SELECT area.Nombre as area, NomPuesto, NombreNivel, IdEmp, ClaveEmpleado, empleado.Nombre, APaterno, AMaterno, empleado.IdArea, empleado.IdPuesto, empleado.IdNivel, Usuario, Contrasena, Email, Foto
FROM empleado
INNER JOIN area ON area.IdArea=empleado.IdArea
INNER JOIN puesto ON empleado.IdPuesto=puesto.IdPuesto
INNER JOIN niveldeacceso ON empleado.IdNivel=niveldeacceso.IdNivel

no me da el resultado que quiero
  #4 (permalink)  
Antiguo 25/10/2013, 11:34
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: Inner Join

Cita:
Hola gracias por responder a mi ayuda. Si quito el Where me manda todos los registros que hay en las tablas pero repetidos unos con otros y solo quiero que me de lo que corresponde a cada tabla dependiendo la ClaveEmpleado o una consulta general sin la condición,
Vamos por partes:
1) No existen repeticiones desde el punto de vista de bases de datos. Repeticiones se dan cuando todos los campos devueltos en la consulta, en cada registro son iguales entre dos registros dados. En tu caso debe estar "repitiendo" algunos datos de algunas columnas, pero eso sólo significa que se trata de tablas relacionadas en cardinalidad 1:N o N:N, y se repiten N veces los registros de al menos una tabla... tantas como registros relacionados hay.
2) Yo de dije que luego de quitarlo verificaras visualmente, es decir que buscaras visualmente el que estás indicando en ese WHERE. La idea es que te dieras cuenta que no había ninguno que cumpliera la condición "ClaveEmpleado='1000'".
¿Se entiende?
Un INNER JOIN devolverá datos si se cumplen todos los INNER JOIN al mismo tiempo, y en el caso de existir condiciones en el WHERE, de los que devuelve el JOIN, sólo los que las cumplen.
Desde el momento en que no da error, entonces lo que tienes son condiciones que no se cumplen en tu consulta.
Tan simple y sencillo como eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 25/10/2013, 11:49
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Inner Join

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Vamos por partes:
1) No existen repeticiones desde el punto de vista de bases de datos. Repeticiones se dan cuando todos los campos devueltos en la consulta, en cada registro son iguales entre dos registros dados. En tu caso debe estar "repitiendo" algunos datos de algunas columnas, pero eso sólo significa que se trata de tablas relacionadas en cardinalidad 1:N o N:N, y se repiten N veces los registros de al menos una tabla... tantas como registros relacionados hay.
2) Yo de dije que luego de quitarlo verificaras visualmente, es decir que buscaras visualmente el que estás indicando en ese WHERE. La idea es que te dieras cuenta que no había ninguno que cumpliera la condición "ClaveEmpleado='1000'".
¿Se entiende?
Un INNER JOIN devolverá datos si se cumplen todos los INNER JOIN al mismo tiempo, y en el caso de existir condiciones en el WHERE, de los que devuelve el JOIN, sólo los que las cumplen.
Desde el momento en que no da error, entonces lo que tienes son condiciones que no se cumplen en tu consulta.
Tan simple y sencillo como eso.

Ok, si yo quito la condición sigue sin aparecer registros a menos que yo quite la relación de las tablas que quedaría asi:

SELECT area.Nombre AS area, NomPuesto, NombreNivel, IdEmp, ClaveEmpleado, empleado.Nombre, APaterno, AMaterno, empleado.IdArea, empleado.IdPuesto, empleado.IdNivel, Usuario, Contrasena, Email, Foto
FROM empleado, area, puesto, niveldeacceso

de esta forma me da un resultado de los registros que están en cada una de las tablas pero sin forma (No tienen relación a lo que debería tener) y si dejo la consulta quitando la condición

asi

SELECT area.Nombre as area, NomPuesto, NombreNivel, IdEmp, ClaveEmpleado, empleado.Nombre, APaterno, AMaterno, empleado.IdArea, empleado.IdPuesto, empleado.IdNivel, Usuario, Contrasena, Email, Foto
FROM empleado
INNER JOIN area ON area.IdArea=empleado.IdArea
INNER JOIN puesto ON empleado.IdPuesto=puesto.IdPuesto
INNER JOIN niveldeacceso ON empleado.IdNivel=niveldeacceso.IdNivel

sigue sin darme datos, pero no muestra error

al igual que la condición que estoy buscando si existe, No se si estoy haciendo algo mal y lo realice de las dos formas que muestro al principio.
  #6 (permalink)  
Antiguo 25/10/2013, 12:08
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: Inner Join

Entendamos un par de conceptos sobre el JOIN:
1) Cuando se trata de JOIN implícitos, MySQL automáticamente realiza un matching entre campos de ambas tablas que tengan el mismo nombre. Esto puede hacer que el join se realice entre campos que teniendo igual nombre, tengan datos diferentes.
Esto obviamente no es lo esperable y los resultado erroneos pueden ser muchos.
2) Un INNER JOIN implica que MySQL devuelva aquellos registros que efectivamente cumplan con lo que se indica en cada uno de los ON. Es decir, si al menos uno de los tres INNER JOIN no se cumple, ese registro no será devuelto bajo ninguna circunstancia.
En tu caso eso significa que todo empleado debe estar relacionado con un área, que cada empleado debe tener un puesto, y que cada empelado debe tener un nivel de acceso declarado.
Cualquiera de los datos que sea opcional, donde el empleado no esté relacionado, y ese empleado no existirá en la tabla devuelta.

Todo esto se puede validar sin problemas, por ejemplo:
Código MySQL:
Ver original
  1. SELECT IdEmp
  2. FROM empleado E LEFT JOIN area A ON A.IdArea = E.IdArea
  3. WHERE A.IdArea IS NULL;
  4.  
  5. SELECT IdEmp
  6. FROM empleado E LEFT JOIN JOIN niveldeacceso N ON E.IdNivel = N.IdNivel
  7. WHERE N.IdNivel IS NULL;
  8.  
  9. SELECT IdEmp
  10. FROM empleado E LEFT JOIN puesto P ON E.IdPuesto = P.IdPuesto
  11. WHERE P.IdPuesto  IS NULL;
Si alguna de estas devuelve datos, ese registro no saldrá en tu consulta principal.

No hay otra alternativa.

Por cierto, el uso de JOIN implícito tal como lo planteaste puede generar un producto cartesiano entre registros no relacionados. Ese es uno de los peores escenarios de consulta, porque es pura basura.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 25/10/2013, 12:51
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Inner Join

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Entendamos un par de conceptos sobre el JOIN:
1) Cuando se trata de JOIN implícitos, MySQL automáticamente realiza un matching entre campos de ambas tablas que tengan el mismo nombre. Esto puede hacer que el join se realice entre campos que teniendo igual nombre, tengan datos diferentes.
Esto obviamente no es lo esperable y los resultado erroneos pueden ser muchos.
2) Un INNER JOIN implica que MySQL devuelva aquellos registros que efectivamente cumplan con lo que se indica en cada uno de los ON. Es decir, si al menos uno de los tres INNER JOIN no se cumple, ese registro no será devuelto bajo ninguna circunstancia.
En tu caso eso significa que todo empleado debe estar relacionado con un área, que cada empleado debe tener un puesto, y que cada empelado debe tener un nivel de acceso declarado.
Cualquiera de los datos que sea opcional, donde el empleado no esté relacionado, y ese empleado no existirá en la tabla devuelta.

Todo esto se puede validar sin problemas, por ejemplo:
Código MySQL:
Ver original
  1. SELECT IdEmp
  2. FROM empleado E LEFT JOIN area A ON A.IdArea = E.IdArea
  3. WHERE A.IdArea IS NULL;
  4.  
  5. SELECT IdEmp
  6. FROM empleado E LEFT JOIN JOIN niveldeacceso N ON E.IdNivel = N.IdNivel
  7. WHERE N.IdNivel IS NULL;
  8.  
  9. SELECT IdEmp
  10. FROM empleado E LEFT JOIN puesto P ON E.IdPuesto = P.IdPuesto
  11. WHERE P.IdPuesto  IS NULL;
Si alguna de estas devuelve datos, ese registro no saldrá en tu consulta principal.

No hay otra alternativa.

Por cierto, el uso de JOIN implícito tal como lo planteaste puede generar un producto cartesiano entre registros no relacionados. Ese es uno de los peores escenarios de consulta, porque es pura basura.
Realice lo que me dijiste, y busque todos los datos de mis tablas que realmente estuvieran coincidiendo y tenias razón, algunos de los datos ya no eran validos como el área que tenia asignado el empleado, por lo cual como mencionas no me daba la consulta y no lo había mencionado pero al yo realizar las consultas que puse primero anteriormente si me daba mi resultado, pero por x causa ya después en otras pruebas entre que quitas y agregas registros no me percate de esa parte. Pero ya quedo.

Muchas gracias por tu aporte, es bueno contar con personas como tu =).

Saludos
  #8 (permalink)  
Antiguo 25/10/2013, 13:54
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: Inner Join

__________________
¿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, registro, select, 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 14:47.