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

Error en LEFT JOIN

Estas en el tema de Error en LEFT JOIN en el foro de Mysql en Foros del Web. Hola estimados: Estoy teniendo un error en una consulta usando left join, no se que estoy haciendo mal, en la siguiente consulta el campo mar.cod_aro ...
  #1 (permalink)  
Antiguo 28/02/2013, 12:25
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.650
Antigüedad: 11 años, 11 meses
Puntos: 336
Error en LEFT JOIN

Hola estimados:

Estoy teniendo un error en una consulta usando left join, no se que estoy haciendo mal, en la siguiente consulta el campo mar.cod_aro existe, sin embargo me sale un mensaje de error indicando que no es así:

Código MySQL:
Ver original
  1. SELECT mar.cod_aro,mar.des_aro,mar.cod_medida,tma.nom_marca,mcxe.id
  2. FROM maros AS mar, tmarcas AS tma
  3.  
  4. LEFT JOIN mcompoxequipo AS mcxe
  5. ON mcxe.cod_componente=mar.cod_aro AND mcxe.cod_eq='72' AND mcxe.cod_tipocomponente=3
  6.  
  7. WHERE tma.cod_marca=mar.cod_marca AND tma.cod_tipocomponente=3 ORDER BY tma.nom_marca,mar.des_aro

Este es el mensaje de error:

#1054 - Unknown column 'mar.cod_aro' in 'on clause'

Lo he revisado varias veces y sigo sin ver el error, please help! :(
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #2 (permalink)  
Antiguo 28/02/2013, 12:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Error en LEFT JOIN

Lo que dice es que la tabla MAROS no tiene ningún campo denominado COD_ARO, según indica la cláusula ON del LEFT JIN.
Yo he visto algunas veces ese error cuando mezclas un INNER/LEFT/RIGHTH JOIN con un JOIN implícito (la coma), por lo que recomiendo que no se lo haga. Usa JOINs explícitos o no lo uses.
Por otro lado, tu consulta parece algo redundante y mal escrita.
Yo la usaría mas o menos así:
Código MySQL:
Ver original
  1.     mar.cod_aro,
  2.     mar.des_aro,
  3.     mar.cod_medida,
  4.     tma.nom_marca,
  5.     mcxe.id
  6.     maros mar
  7.     INNER JOIN tmarcas tma ON tma.cod_marca = mar.cod_marca AND mcxe.cod_tipocomponente = tma.cod_tipocomponente
  8.     LEFT JOIN mcompoxequipo mcxe  ON mcxe.cod_componente = mar.cod_aro
  9.     mcxe.cod_eq='72'
  10.     AND tma.cod_tipocomponente=3
  11. ORDER BY tma.nom_marca, mar.des_aro

Prueba y veamos.
__________________
¿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 28/02/2013, 12:58
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.650
Antigüedad: 11 años, 11 meses
Puntos: 336
Respuesta: Error en LEFT JOIN

Gracias por responder! :D

La verdad no se que es un join implícito o explícito, tampoco sabia que se podia omitir el "AS".

Lamentablemente ahora me dice que no existe cod_tipocomponente siendo que claramente está declarado en la consulta, no entiendo :S

#1054 - Unknown column 'mcxe.cod_tipocomponente' in 'on clause'
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #4 (permalink)  
Antiguo 28/02/2013, 13:09
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.650
Antigüedad: 11 años, 11 meses
Puntos: 336
Respuesta: Error en LEFT JOIN

Haciéndolo así me ha funcionado, pero no estoy seguro de que esté correcto:

Código MySQL:
Ver original
  1. SELECT mar.cod_aro,mar.des_aro,mar.cod_medida,tma.nom_marca,mcxe.id
  2. FROM maros mar
  3.  
  4. INNER JOIN tmarcas tma
  5. ON tma.cod_marca=mar.cod_marca AND tma.cod_tipocomponente=3
  6.  
  7. LEFT JOIN mcompoxequipo mcxe
  8. ON mcxe.cod_componente=mar.cod_aro AND mcxe.cod_eq='72' AND mcxe.cod_tipocomponente=3
  9.  
  10. ORDER BY tma.nom_marca,mar.des_aro
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #5 (permalink)  
Antiguo 28/02/2013, 13:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Error en LEFT JOIN

Vamos por partes:
Cita:
Lamentablemente ahora me dice que no existe cod_tipocomponente siendo que claramente está declarado en la consulta, no entiendo :S
Que lo declares en la consulta no implica que exista en la tabla... Lo que te dice es que en la tabla no existe ese campo.
Verifica la tabla.

Segundo: No pongas condiciones en el FROM comparando contra constantes. No es buena práctica, y puede ser ineficiente.
Pruebalo así, tal y como te lo mando:
Código MySQL:
Ver original
  1.     mar.cod_aro,
  2.     mar.des_aro,
  3.     mar.cod_medida,
  4.     tma.nom_marca,
  5.     mcxe.id
  6. FROM maros mar
  7.     INNER JOIN tmarcas tma ON tma.cod_marca=mar.cod_marca
  8.     LEFT JOIN mcompoxequipo mcxe ON (mcxe.cod_componente = mar.cod_aro AND  tma.cod_tipocomponente = mcxe.cod_tipocomponente)
  9.     tma.cod_tipocomponente =3
  10.     AND mcxe.cod_eq='72'
  11. ORDER BY tma.nom_marca, mar.des_aro
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 28/02/2013, 13:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 13 años, 1 mes
Puntos: 447
Respuesta: Error en LEFT JOIN

Hola stramin:

En lo particular, trataría de separa las condiciones de unión con respecto a las condiciones de filtrado de la consulta, algo parecido a lo que propone gnzsoloyo:

Código MySQL:
Ver original
  1.    mar.cod_aro,
  2.    mar.des_aro,
  3.    mar.cod_medida,
  4.    tma.nom_marca,
  5.    mcxe.id
  6. FROM maros mar
  7.    INNER JOIN tmarcas tma ON tma.cod_marca=mar.cod_marca  
  8. LEFT JOIN mcompoxequipo mcxe ON mcxe.cod_componente = mar.cod_aro
  9.    tma.cod_tipocomponente=3 AND
  10.    mcxe.cod_eq='72' AND
  11.    mcxe.cod_tipocomponente=3
  12. ORDER BY tma.nom_marca,mar.des_aro

Y desde mi punto de vista, el campo cod_tipocomponente también puede ser un criterio de unión, de tal forma que podrías tratar de hacer algo como esto:

Código MySQL:
Ver original
  1.    mar.cod_aro,
  2.    mar.des_aro,
  3.    mar.cod_medida,
  4.    tma.nom_marca,
  5.    mcxe.id
  6. FROM maros mar
  7.    INNER JOIN tmarcas tma ON tma.cod_marca=mar.cod_marca  
  8. LEFT JOIN mcompoxequipo mcxe ON
  9.    mcxe.cod_componente = mar.cod_aro AND
  10.    tma.cod_tipocomponent = mcxe.cod_tipocomponente
  11.    tma.cod_tipocomponente=3 AND
  12.    mcxe.cod_eq='72'
  13. ORDER BY tma.nom_marca,mar.des_aro

Haz la prueba y nos comentas.

Saludos
Leo.

Cita:
Editado: otra vez se me adelantó gnzsoloyo con la respuesta jejejeje. Saludos!!!
  #7 (permalink)  
Antiguo 28/02/2013, 13:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Error en LEFT JOIN



Visiones parecidas para muchos problemas.

Saludos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 28/02/2013, 13:55
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.650
Antigüedad: 11 años, 11 meses
Puntos: 336
Respuesta: Error en LEFT JOIN

Gracias a ambos :)

la verdad algo ha ido mal en las 2 consultas, tanto la de gnzsoloyo y la de leonardo_josue, me explico:

Esto es lo que debería obtener, corresponde a todos los aros y una id opcional que aparece solo si hay registro en mcompoxequipo (mcxe):


Sin embargo está mostrando solo las que poseen coincidencias:


No entiendo por que no funciona siendo que han puesto un LEFT JOIN, el cual debería funcionar para agregar la tabla condicionalmente, tendrá algo que ver que se haya puesto la condición en el WHERE?
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #9 (permalink)  
Antiguo 28/02/2013, 14:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Error en LEFT JOIN

Eso es fácil: No estamos incluyendo la condición de NULL.

Código MySQL:
Ver original
  1.     mar.cod_aro,
  2.     mar.des_aro,
  3.     mar.cod_medida,
  4.     tma.nom_marca,
  5.     mcxe.id
  6. FROM maros mar
  7.     INNER JOIN tmarcas tma ON tma.cod_marca=mar.cod_marca
  8.     LEFT JOIN mcompoxequipo mcxe ON (mcxe.cod_componente = mar.cod_aro AND  tma.cod_tipocomponente = mcxe.cod_tipocomponente)
  9.     (tma.cod_tipocomponente =3 OR  mcxe.cod_tipocomponente IS NULL
  10.     AND mcxe.cod_eq='72'
  11. ORDER BY tma.nom_marca, mar.des_aro
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 28/02/2013, 14:29
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.650
Antigüedad: 11 años, 11 meses
Puntos: 336
Respuesta: Error en LEFT JOIN

Como no se me había ocurrido? XD

bueno... lo he probado y ahora me ha quedado peor D:

Que está pasando con esta consulta?

ahora en vez de mostrarme los null me esta mostrando ids aleatorias y esta repitiendo los aros hasta 5 veces T.T



Creen que sea arreglable? o lo dejo como estaba al principio? :(
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #11 (permalink)  
Antiguo 28/02/2013, 14:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Error en LEFT JOIN

Habría que analizar si las relaciones que sugieren tus tablas están bien, o realmente hay inconsistencias de datos.
Ahora estoy trabajando, lo revisaré con más tranquilidad a la noche.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 28/02/2013, 16:16
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 13 años, 1 mes
Puntos: 447
Respuesta: Error en LEFT JOIN

Hola stramin:

Por lo pronto postea una imagen de cada una de las tablas, creo que el problema como indica gnzsoloyo puede estar en el hecho de no definir todas las relaciones que existen. En la última consulta tal pareciera que se está realizando un producto cartesiano entre las tablas, lo que sugiere que falta especificar algún criterio de unidad. a partir de los datos de tus tablas dinos qué es lo que esperas obtener como salida, así será más fácil dar con una respuesta.

Saludos
Leo.
  #13 (permalink)  
Antiguo 28/02/2013, 17:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Error en LEFT JOIN

Vamos a desglosar la consulta parte por parte para ver si se entiende. Por lo que he visto, has copiado en dos ocasiones lo que te proponemos, pero no al pie de la letra.
Ten en cuenta que al adaptar una consulta, debes respetar la lógica que se aplica, y me parece que el problema puede deberse a que algo no está bien entendido, o no fue respetado.
La consulta que te propusimos fue esencialmente esta (la restructure con comentarios para que se entienda mejor):
Código MySQL:
Ver original
  1.     mar.cod_aro,
  2.     mar.des_aro,
  3.     mar.cod_medida,
  4.     tma.nom_marca,
  5.     mcxe.id
  6. FROM maros mar
  7.     INNER JOIN
  8.     tmarcas tma ON tma.cod_marca = mar.cod_marca
  9.     # Con esto sólo devolvera lo que hay en comun en ambas tablas.
  10.     LEFT JOIN
  11.     mcompoxequipo mcxe ON
  12.         (mcxe.cod_componente = mar.cod_aro
  13.         AND  
  14.         tma.cod_tipocomponente = mcxe.cod_tipocomponente)
  15.     # Esto devuelve todo lo devuelto por las dos primeras tablas
  16.     # y todo lo que coincida o no con la tercera, es decir
  17.     # que en la tercera deberían aparecer NULL donde no hay coincidencias.
  18.     # Los parentesis son para asegurar que compare ambas condiciones como una sola.
  19.     (tma.cod_tipocomponente =3
  20.     OR  
  21.     mcxe.cod_tipocomponente IS NULL)
  22.     # Esto se pone entre parentesis para que se evalue como una sola cosa:
  23.     # Que el tma.cod_tipocomponente sea igual a 3, o bien que sea NULL.
  24.     # No es necesario definir que mcxe.cod_tipocomponente sea 3 (como ponias)
  25.     # porque siendo esa condicion esta implícita en la relacion del FROM.
  26.     # Se pide que sean iguales, que sean iguales a 3 o NULL.
  27.     AND mcxe.cod_eq='72'
  28.     # Esta condición sólo se puede dar si coinciden la tabla derivada y la tercer tabla.
  29. ORDER BY tma.nom_marca, mar.des_aro
Ahora bien, si sucede que el campo mcxe.cod_tipocomponente puede ser NULL por un error de consistencia, entonces deberíamos replantar la condición del WHERE así:
Código MySQL:
Ver original
  1.     mar.cod_aro,
  2.     mar.des_aro,
  3.     mar.cod_medida,
  4.     tma.nom_marca,
  5.     mcxe.id
  6. FROM maros mar
  7.     INNER JOIN
  8.     tmarcas tma ON tma.cod_marca = mar.cod_marca
  9.     LEFT JOIN
  10.     mcompoxequipo mcxe ON
  11.         (mcxe.cod_componente = mar.cod_aro
  12.         AND  
  13.         tma.cod_tipocomponente = mcxe.cod_tipocomponente)
  14.     (tma.cod_tipocomponente =3
  15.     OR  
  16.     mcxe.id IS NULL)
  17.     AND mcxe.cod_eq='72'
  18. ORDER BY tma.nom_marca, mar.des_aro
Si esto último no funciona, entonces yo empezaría a pensar que realmente hay un problema de datos sucios.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 01/03/2013, 06:05
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.650
Antigüedad: 11 años, 11 meses
Puntos: 336
Respuesta: Error en LEFT JOIN

Las consultas las estoy copiando y pegando tal como la publican, la última consulta publicada sigue arrojando solo los 3 resultados coincidentes con la tabla mcompoxequipo (o sea sin los null):



Estas son las 3 tablas involucradas (solo los primeros registros):

maros:


tmarcas:


mcompoxequipo:


Lo que se busca es mostrar todos los aros con sus respectivas marcas (que tenga cod_tipocomponente 3), y luego mostrar la id del componente (que tambien tenga cod_tipocomponente 3) solo si es que existe, o sea debería quedar algo así:



Esta resultado me salió con la última consulta que he publicado, no estoy seguro de que este bien, pero es lo que debería mostrar con los datos actuales ya que solo los 3 primeros registros tienen id de componente.

Gracias por estarme ayudando :)
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #15 (permalink)  
Antiguo 12/03/2013, 14:49
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.650
Antigüedad: 11 años, 11 meses
Puntos: 336
Respuesta: Error en LEFT JOIN

Saludos!

Me gustaría solicitar la eliminación de este tema ya que no tuvo respuesta y contiene información confidencial sobre las empresas topy y Aros del pacífico.

Gracias y disculpen los inconvenientes :)
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #16 (permalink)  
Antiguo 12/03/2013, 14:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Error en LEFT JOIN

Tienes que leer con más atención las políticas de uso de FDW:
Cita:
4. Normas de los Contenidos y su licencia

4.1 Desde el 1 de Julio del 2007 se entiende que todos los contenidos que los usuarios publican a partir de dicha fecha son otorgados bajo licencia Creative Commons BY-NC-SA.

4.2 Esta regla aplica únicamente para los contenidos originales que cada usuario envíe al foro, no así a imágenes que provengan de servidores externos o cualquier otro contenido protegido por leyes de propiedad intelectual utilizados en el marco legal.

4.3 Debido a que los contenidos del sitio son liberados y compartidos en base a la licencia Creative Commons BY-NC-SA de solicitarse la eliminación de un usuario, los contenidos quedarán publicados con un usuario invitado, para poder conservar la integridad de las conversaciones. No eliminamos mensajes, si lo publicas, lo compartes y lo difundes.
Por otro lado, el tema no ha tenido respuesta aún porque muchos de nosotros trabajamos, y hacemos esto vocacionalmente. EN mi caso, se me pasó el último post y no volví sobre el asunto.
Lo veré en cuanto pueda.
__________________
¿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, left, select
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 07:26.