Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/06/2013, 14:53
max_mouse699
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años
Puntos: 7
Algunos registros repetidos en consulta

Buenas.

Tengo el siguiente problema:

Tengo una consulta que en su estructura principal me funciona super bien, yo le llamo la consulta basica:

Código MySQL:
Ver original
  1.     bodfam.descripcion AS familia,
  2.     bodestart.descripcion AS 'nombre_estado_articulo',
  3.     bum.descripcion AS unidad_medida,
  4.     bodmar.descripcion AS marca,
  5.     bodmod.descripcion AS modelo,
  6.     bodart.*
  7. FROM bdsistema.bodega_articulo bodart
  8. LEFT JOIN bdsistema.bodega_familia bodfam ON bodfam.id_interno = bodart.id_familia
  9. LEFT JOIN bdsistema.bodega_unidad_medida bum ON bum.id_interno = bodart.id_unidad
  10. LEFT JOIN bdsistema.bodega_marca bodmar ON bodmar.id_interno = bodart.id_marca
  11. LEFT JOIN bdsistema.bodega_modelo bodmod ON bodmod.id_interno = bodart.id_modelo
  12. LEFT JOIN bdsistema.bodega_estado bodestart ON bodestart.id_interno = bodart.estado_articulo

Ahoar os explico la construccion de las BD:

Tengo una BD de articulos, la cual contiene su id_interno y todos sus campos que pertenecen a las caracteristicas del articulo.
Tengo la BD de unidad_medida, que simplemnte enlaza con la tabla articulos, en la cual tengo definido simplemente un id_interno y una descripcion que corresponde a las unidades de medida.
Tengo la BD's de marcas, modelo y estado, que hacen exactamente lo mismo que la anterior.
El problema es cuando a la consulta le agrego la tabla de etiquetas_articulo, que es una tabla que contiene las etiquetas de los articulos. Esta tabla esta a su vez desglosada en la tabla etiquetas, que contiene el id_interno y la descripcion de las etiquetas, y en la tabla etiquetas_articulos, guardo el id de la tabla etiquetas mas el id del articulo. Pero cuando a dos o mas articulos le defino etiquetas, la consulta que les mencione me arroja por ejemplo el sigueinte resultado.

id_articulo nombre_articulo
1 ampolleta 12 volts
2 ampolleta 10 volts
3 ampolleta 15 volts
3 ampolleta 15 volts

Lo que sucede, y el porque me arroja esto es porque a los articulos 1 y 2, les defini una etiqueta, pero al 3 articulo no le defini etiqueta.
La consulta final seria esta:

Código MySQL:
Ver original
  1.     bodfam.descripcion AS familia,
  2.     bodestart.descripcion AS 'nombre_estado_articulo',
  3.     bum.descripcion AS unidad_medida,
  4.     bodmar.descripcion AS marca,
  5.     bodmod.descripcion AS modelo,
  6.     bodart.*
  7. FROM bdsistema.bodega_articulo bodart
  8. LEFT JOIN bdsistema.bodega_familia bodfam ON bodfam.id_interno = bodart.id_familia
  9. LEFT JOIN bdsistema.bodega_unidad_medida bum ON bum.id_interno = bodart.id_unidad
  10. LEFT JOIN bdsistema.bodega_marca bodmar ON bodmar.id_interno = bodart.id_marca
  11. LEFT JOIN bdsistema.bodega_modelo bodmod ON bodmod.id_interno = bodart.id_modelo
  12. LEFT JOIN bdsistema.bodega_estado bodestart ON bodestart.id_interno = bodart.estado_articulo
  13. LEFT JOIN bdsistema.bodega_etiqueta_articulo bodetiart ON bodetiart.id_articulo = bodart.id_interno
  14. LEFT JOIN bdsistema.bodega_etiquetas bodeti ON bodeti.id_interno = bodetiart.id_etiqueta

Si se dan cuenta, ahora le agregue las tablas etiqeta_articulo y etiquetas. Esta consulta es la que me devuelve los registros que mas arriba menciono.

Ahora averiguando y leyendo por ahi, pude encontrar esto que me podria solucionar el problema: Realizrlo con FULL OUTER JOIN

El problema es que MySQL al parecer no soporta FULL OUTER JOIN. Otra solucion, emular el FULL OUTER JOIN. Quedaria como:

Código MySQL:
Ver original
  1.     bodfam.descripcion AS familia,
  2.     bodestart.descripcion AS 'nombre_estado_articulo',
  3.     bum.descripcion AS unidad_medida,
  4.     bodmar.descripcion AS marca,
  5.     bodmod.descripcion AS modelo,
  6.     bodart.*
  7. FROM bdsistema.bodega_articulo bodart
  8. LEFT JOIN bdsistema.bodega_familia bodfam ON bodfam.id_interno = bodart.id_familia
  9. LEFT JOIN bdsistema.bodega_unidad_medida bum ON bum.id_interno = bodart.id_unidad
  10. LEFT JOIN bdsistema.bodega_marca bodmar ON bodmar.id_interno = bodart.id_marca
  11. LEFT JOIN bdsistema.bodega_modelo bodmod ON bodmod.id_interno = bodart.id_modelo
  12. LEFT JOIN bdsistema.bodega_estado bodestart ON bodestart.id_interno = bodart.estado_articulo
  13. LEFT JOIN bdsistema.bodega_etiqueta_articulo bodetiart ON bodetiart.id_articulo = bodart.id_interno
  14. LEFT JOIN bdsistema.bodega_etiquetas bodeti ON bodeti.id_interno = bodetiart.id_etiqueta
  15.     bodfam.descripcion AS familia,
  16.     bodestart.descripcion AS 'nombre_estado_articulo',
  17.     bum.descripcion AS unidad_medida,
  18.     bodmar.descripcion AS marca,
  19.     bodmod.descripcion AS modelo,
  20.     bodart.*
  21.     bdsistema.bodega_articulo bodart LEFT
  22.     JOIN bdsistema.bodega_familia bodfam ON bodfam.id_interno = bodart.id_familia LEFT
  23.     JOIN bdsistema.bodega_unidad_medida bum ON bum.id_interno = bodart.id_unidad LEFT
  24.     JOIN bdsistema.bodega_marca bodmar ON bodmar.id_interno = bodart.id_marca LEFT
  25.     JOIN bdsistema.bodega_modelo bodmod ON bodmod.id_interno = bodart.id_modelo LEFT
  26.     JOIN bdsistema.bodega_estado bodestart ON bodestart.id_interno = bodart.estado_articulo
  27. RIGHT JOIN bdsistema.bodega_etiqueta_articulo bodetiart ON bodetiart.id_articulo = bodart.id_interno
  28. LEFT JOIN bdsistema.bodega_etiquetas bodeti ON bodeti.id_interno = bodetiart.id_etiqueta

El problema hasta aqui, solucionado, pero cuando se me complica, es cuando a la consulta le agrego los parametros de busqueda o de filtrado de datos con la condicion WHERE, porque si quiero filtrar, por ejemplo, por todas las ampolletas en que cuya etiqueta sea "carroceria", deberia mostrarme dos articulos, pero al momento de agregarlos a la consulta, solo me muestra el articulo que no tiene etiquetas. Por ejemplo asi:

Código MySQL:
Ver original
  1.     bodfam.descripcion AS familia,
  2.     bodestart.descripcion AS 'nombre_estado_articulo',
  3.     bum.descripcion AS unidad_medida,
  4.     bodmar.descripcion AS marca,
  5.     bodmod.descripcion AS modelo,
  6.     bodart.*
  7. FROM bdsistema.bodega_articulo bodart
  8. LEFT JOIN bdsistema.bodega_familia bodfam ON bodfam.id_interno = bodart.id_familia
  9. LEFT JOIN bdsistema.bodega_unidad_medida bum ON bum.id_interno = bodart.id_unidad
  10. LEFT JOIN bdsistema.bodega_marca bodmar ON bodmar.id_interno = bodart.id_marca
  11. LEFT JOIN bdsistema.bodega_modelo bodmod ON bodmod.id_interno = bodart.id_modelo
  12. LEFT JOIN bdsistema.bodega_estado bodestart ON bodestart.id_interno = bodart.estado_articulo
  13. LEFT JOIN bdsistema.bodega_etiqueta_articulo bodetiart ON bodetiart.id_articulo = bodart.id_interno
  14. LEFT JOIN bdsistema.bodega_etiquetas bodeti ON bodeti.id_interno = bodetiart.id_etiqueta
  15.     INSTR(bodeti.descripcion, 'carroceria') > 0
  16.     bodfam.descripcion AS familia,
  17.     bodestart.descripcion AS 'nombre_estado_articulo',
  18.     bum.descripcion AS unidad_medida,
  19.     bodmar.descripcion AS marca,
  20.     bodmod.descripcion AS modelo,
  21.     bodart.*
  22.     bdsistema.bodega_articulo bodart LEFT
  23.     JOIN bdsistema.bodega_familia bodfam ON bodfam.id_interno = bodart.id_familia LEFT
  24.     JOIN bdsistema.bodega_unidad_medida bum ON bum.id_interno = bodart.id_unidad LEFT
  25.     JOIN bdsistema.bodega_marca bodmar ON bodmar.id_interno = bodart.id_marca LEFT
  26.     JOIN bdsistema.bodega_modelo bodmod ON bodmod.id_interno = bodart.id_modelo LEFT
  27.     JOIN bdsistema.bodega_estado bodestart ON bodestart.id_interno = bodart.estado_articulo
  28. RIGHT JOIN bdsistema.bodega_etiqueta_articulo bodetiart ON bodetiart.id_articulo = bodart.id_interno
  29. LEFT JOIN bdsistema.bodega_etiquetas bodeti ON bodeti.id_interno = bodetiart.id_etiqueta
  30.     INSTR(bodeti.descripcion, 'carroceria') > 0

Si se fijan, ambas consultas tienenla condicion where, pero la consulta me arroja solo el articulo que no tiene etiquetas asociadas. Alguien me podria dar in consejo aunque fuera sencillo de como lo podria hacer para que me muestre aquellos articulos de lo cuales estoy buscando por su etiqueta ?

Saludos.

editado PD: al publicar este problema me di cuenta que el titulo es incorrceto, espero me disculpen.

Última edición por max_mouse699; 26/06/2013 a las 14:55 Razón: titulo incorrecto