Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: [Decoded] en 27 Septiembre 2017, 01:11 am



Título: Ayuda con Inner Join e IDs repetidos - MySQL
Publicado por: [Decoded] en 27 Septiembre 2017, 01:11 am
Buenas noches ElHacker.net hace años que no ando por aqui, esta vez les vengo a fastidiar con un problema que tengo en MySQL

Tengo las tablas: producto, categorias, marcaproducto, ingreso_producto y tienen aproximadamente el siguiente contenido:

PRODUCTO:
idcodigodescripcionfotonombre_marcastock
1123456789PLC Modicon    null16
2444444444HMI Magelis    null13

CATEGORIAS:
IDCategorias
1Automatizacion

marcaproducto:
idnombre_marca
1Schneider Electric

proveedores:
idnombre_proveedor
1ChijauKay Electric

ingreso_producto:
idid_productocantidadid_proveedorprecio_comprafecha
11311002017-09-26 16:33:36
2131982017-09-26 16:34:08
3221502017-09-26 17:04:20

Estoy haciendo la siguiente consulta:

Código
  1. SELECT P.id, P.codigo, P.descripcion, MP.nombre_marca, P.foto, IP.precio_compra, P.precio_venta, P.stock, C.descripcion AS DesCategoria, Pro.nombre_proveedor, IP.fecha
  2. FROM producto AS P
  3. INNER JOIN categorias AS C ON P.id_categoria = C.id
  4. INNER JOIN marcaproducto AS MP ON P.id_marcaproducto = MP.id
  5. INNER JOIN proveedores AS Pro ON P.id_proveedor = Pro.id
  6. INNER JOIN ingreso_producto AS IP ON P.id = IP.id_producto
  7. ORDER BY fecha ASC

y tengo como respuesta lo siguiente:

id | codigo           | descripcion     | nombre_marca      | foto    | precio_compra | precio_venta | stock | DesCategoria        | nombre_proveedor | fecha
1 | 123456789   | PLC Modicon  | Schneider Electric   | NULL  |    100.00         | 0.00             | 0      | Automatizacion     | ChijauKay Electric  | 2017-09-26 16:33:36
1 | 123456789   | PLC Modicon  | Schneider Electric   | NULL  |    170.00         | 0.00             | 0      | Automatizacion     | ChijauKay Electric  | 2017-09-26 16:34:08
2 | 444444444   | HMI Magelis   | Schneider Electric   | NULL  |     98.00          | 0.00             | 0      | Automatizacion     | ChijauKay Electric  | 2017-09-26 16:54:38

Como podran ver los IDs se estan repitiendo, he probado con muchas formas que he encontrado en google pero no me funciona ninguno :( ¿En que estoy mal?
Quiero que solo muestre del que tenga la mayor fecha del ID que se repite. osea mas o menos asi:
id | codigo           | descripcion     | nombre_marca      | foto    | precio_compra | precio_venta | stock | DesCategoria        | nombre_proveedor | fecha
1 | 123456789   | PLC Modicon  | Schneider Electric   | NULL  |    170.00         | 0.00             | 0      | Automatizacion     | ChijauKay Electric  | 2017-09-26 16:34:08
2 | 444444444   | HMI Magelis   | Schneider Electric   | NULL  |     98.00          | 0.00             | 0      | Automatizacion     | ChijauKay Electric  | 2017-09-26 16:54:38



Le dare mis tremendas gracias a quien se tome la molestia de leer este post y muchas gracias  :(


Título: Re: Ayuda con Inner Join e IDs repetidos - MySQL
Publicado por: Toxico en 27 Septiembre 2017, 08:27 am
Lo que estas haciendo mal es que en ningun lado colocas que quieres el maximo, no he probado el query pero mas o menos debe funcionar.

Código
  1.  
  2. SELECT t.id,
  3. t.codigo,
  4. t.descripcion,
  5. t.nombre_marca,
  6. t.foto,
  7. t.precio_compra,
  8. t.precio_venta,
  9. t.stock,
  10. t.DesCategoria,
  11. t.nombre_proveedor
  12. FROM
  13. (
  14. SELECT P.id,
  15. P.codigo,
  16. P.descripcion,
  17. MP.nombre_marca,
  18. P.foto,
  19. P.precio_venta,
  20. P.stock,
  21. C.descripcion AS DesCategoria,
  22. Pro.nombre_proveedor,
  23. PI.precio_compra,
  24. PI.fecha
  25. FROM producto AS P
  26. INNER JOIN categorias AS C ON P.id_categoria = C.id
  27. INNER JOIN marcaproducto AS MP ON P.id_marcaproducto = MP.id
  28. INNER JOIN proveedores AS Pro ON P.id_proveedor = Pro.id
  29. )  t  INNER JOIN (
  30. SELECT id_producto,
  31. precio_compra,
  32. fecha
  33. FROM ingreso_producto INNER JOIN (
  34. SELECT
  35. id_producto,
  36. MAX(IP.fecha) AS fecha
  37. FROM ingreso_producto
  38.                                                                        GROUP BY id_producto
  39. ) set_max_fecha
  40. ON ingreso_producto.id_producto = set_max_fecha.id_producto
  41.                AND ingreso_producto.fecha = set_max_fecha.fecha
  42. ) PI
  43. ON P.id = PI.id_producto
  44. ORDER BY fecha ASC
  45.  
  46.  



Título: Re: Ayuda con Inner Join e IDs repetidos - MySQL
Publicado por: [Decoded] en 27 Septiembre 2017, 08:38 am
Gracias por la respuesta Toxico! Aqui ya son las 01:36 y por ahora sin acceso a mi PC, maniana lo probare a detalle, pero metiendo esa consulta a la base de datos por mi celular, tengo el siguiente resultado:

MySQL ha dicho: Documentación

#1054 - La columna 'PI.precio_compra' en field list es desconocida

Gracias por darte el tiempo de ayudarme  :D

 


Título: Re: Ayuda con Inner Join e IDs repetidos - MySQL
Publicado por: Toxico en 27 Septiembre 2017, 19:52 pm
Razon llevas, prueba con esto.

Código
  1. SELECT t.id,
  2. t.codigo,
  3. t.descripcion,
  4. t.nombre_marca,
  5. t.foto,
  6. t.precio_compra,
  7. t.precio_venta,
  8. t.stock,
  9. t.DesCategoria,
  10. t.nombre_proveedor,
  11. PI.precio_compra,
  12. PI.fecha
  13. FROM
  14. (
  15. SELECT P.id,
  16. P.codigo,
  17. P.descripcion,
  18. MP.nombre_marca,
  19. P.foto,
  20. P.precio_venta,
  21. P.stock,
  22. C.descripcion AS DesCategoria,
  23. Pro.nombre_proveedor
  24. FROM producto AS P
  25. INNER JOIN categorias AS C ON P.id_categoria = C.id
  26. INNER JOIN marcaproducto AS MP ON P.id_marcaproducto = MP.id
  27. INNER JOIN proveedores AS Pro ON P.id_proveedor = Pro.id
  28. )  t  INNER JOIN (
  29. SELECT id_producto,
  30. precio_compra,
  31. fecha
  32. FROM ingreso_producto INNER JOIN (
  33. SELECT
  34. id_producto,
  35. MAX(IP.fecha) AS fecha
  36. FROM ingreso_producto
  37.                                                GROUP BY id_producto
  38. ) set_max_fecha
  39. ON ingreso_producto.id_producto = set_max_fecha.id_producto
  40.                AND ingreso_producto.fecha = set_max_fecha.fecha
  41. ) PI
  42. ON P.id = PI.id_producto
  43. ORDER BY fecha ASC
  44.