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

Consulta cruzada de 4 tablas

Estas en el tema de Consulta cruzada de 4 tablas en el foro de Mysql en Foros del Web. Hola, estoy intentando hacer una extracción de un listado de clientes en prestashop para mostrarlo en pdf, este listado muestra los datos del cliente y ...
  #1 (permalink)  
Antiguo 04/06/2013, 10:26
 
Fecha de Ingreso: julio-2005
Mensajes: 304
Antigüedad: 18 años, 9 meses
Puntos: 4
Consulta cruzada de 4 tablas

Hola, estoy intentando hacer una extracción de un listado de clientes en prestashop para mostrarlo en pdf, este listado muestra los datos del cliente y las compras que ya a realizado, la primera tengo que sacar los datos de la tabla ps_customer y de la tabla ps_address y lo hago con INNER JOIN.

Código MySQL:
Ver original
  1. SELECT ps_customer.id_customer, ps_customer.firstname,
  2. ps_customer.lastname, address1, address2, city, postcode, phone, phone_mobile
  3. FROM ps_customer INNER JOIN ps_address ON s_address.id_customer=ps_customer.id_customer
  4. ORDER BY postcode;

La segunda parte es en la que me pierdo, por que para mostrar el producto que ha comprado primero tengo que cruzar con la tabla ps_orders que es donde se une el pedido con el cliente y consultar el nombre del pedido en la tabla ps_order_detail.

Gracias de antemano.
__________________
http://www.lynxstyle.net

En la vida como en el ajedrez, hay un reloj que marca el tiempo de cada movimiento, si lo consumes pierde (MJJG)

Última edición por gnzsoloyo; 04/06/2013 a las 10:46 Razón: Código de programacion no permitido en foros de BBDD
  #2 (permalink)  
Antiguo 04/06/2013, 10:56
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta cruzada de 4 tablas

Hola lynxstyle:

¿Cuál es el problema? ¿por qué dices que te pierdes en la consulta? También tendrías que comentarnos si lo que pretendes es obtener en una sola consulta toda la información que vas a mostrar... no sé con qué herramienta vas a generar el PDF, pero es posible que puedas utilizar varias consultas para generar toda la información que necesitas.

Si la idea es obtener toda la información con una sola consulta, es posible que tengas información duplicada, imagina el siguiente ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM clientes;
  2. +-----------+---------------+
  3. | idCliente | nombreCliente |
  4. +-----------+---------------+
  5. |         1 | uno           |
  6. |         2 | dos           |
  7. |         3 | tres          |
  8. +-----------+---------------+
  9. 3 rows in set (0.32 sec)
  10.  
  11. mysql> SELECT * FROM pedidos;
  12. +----------+-----------+-------------+
  13. | idPedido | idCliente | fechaCompra |
  14. +----------+-----------+-------------+
  15. |        1 |         1 | 2013-04-14  |
  16. |        2 |         2 | 2013-05-30  |
  17. |        3 |         2 | 2013-06-05  |
  18. |        4 |         1 | 2013-06-10  |
  19. |        5 |         1 | 2013-06-04  |
  20. +----------+-----------+-------------+
  21. 5 rows in set (0.00 sec)
  22.  
  23. mysql> SELECT * FROM detalle_pedidos;
  24. +-----------------+----------+-------------------+----------+
  25. | idDetallePedido | idPEdido | producto          | cantidad |
  26. +-----------------+----------+-------------------+----------+
  27. |               1 |        1 | producto uno.1    |        1 |
  28. |               2 |        1 | producto uno.2    |        2 |
  29. |               3 |        2 | producto dos.1    |        3 |
  30. |               4 |        3 | producto tres.1   |        6 |
  31. |               5 |        4 | producto cuatro.1 |        7 |
  32. |               6 |        5 | producto cinco.1  |        2 |
  33. |               7 |        5 | producto cinco.2  |        1 |
  34. +-----------------+----------+-------------------+----------+
  35. 7 rows in set (0.00 sec)
  36.  
  37. mysql> SELECT c.*, p.fechaCompra, dp.producto, dp.cantidad
  38.     -> FROM clientes c
  39.     -> INNER JOIN pedidos p ON c.idCliente = p.idCliente
  40.     -> INNER JOIN detalle_pedidos dp ON dp.idPedido = p.idPedido
  41.     -> ORDER BY c.idCliente, p.fechaCompra, dp.producto;
  42. +-----------+---------------+-------------+-------------------+----------+
  43. | idCliente | nombreCliente | fechaCompra | producto          | cantidad |
  44. +-----------+---------------+-------------+-------------------+----------+
  45. |         1 | uno           | 2013-04-14  | producto uno.1    |        1 |
  46. |         1 | uno           | 2013-04-14  | producto uno.2    |        2 |
  47. |         1 | uno           | 2013-06-04  | producto cinco.1  |        2 |
  48. |         1 | uno           | 2013-06-04  | producto cinco.2  |        1 |
  49. |         1 | uno           | 2013-06-10  | producto cuatro.1 |        7 |
  50. |         2 | dos           | 2013-05-30  | producto dos.1    |        3 |
  51. |         2 | dos           | 2013-06-05  | producto tres.1   |        6 |
  52. +-----------+---------------+-------------+-------------------+----------+
  53. 7 rows in set (0.00 sec)

Observa que el dato del cliente se repite n veces... esto en realidad para un reporte está de más, pero bueno, esa es cuestión de la lógica que quieras llevar en tu reporte.

Desde mi punto de vista no hay nada extraordinario en la consulta que quieres hacer, simplemente tienes que hacer todos los JOIN's sobre las tablas... No posteas la estructura de tus tablas, ni nos pones tampoco datos de ejemplo por lo que resulta complicado darte una respuesta más puntual.

La idea sería hacer algo como esto:

Código MySQL:
Ver original
  1. ...
  2. FROM ps_customer
  3. INNER JOIN ps_address
  4.   ON ps_address.id_customer=ps_customer.id_customer
  5. INNER JOIN ps_orders  
  6.   ON Aquí pones la relación entre las tablas ps_customer y ps_orders
  7. INNER JOIN ps_order_detail
  8.   ON Aquí pones la relación entre las tablas os_orders y ps_order_detail
  9. ...

Haz la prueba y nos comentas. Si continuas con problemas postea la estructura de tus tablas, pon algunos datos de ejemplo y dinos más cláramente qué es lo que quieres obtener como resultado.

Saludos
Leo.
  #3 (permalink)  
Antiguo 04/06/2013, 13:34
 
Fecha de Ingreso: julio-2005
Mensajes: 304
Antigüedad: 18 años, 9 meses
Puntos: 4
Respuesta: Consulta cruzada de 4 tablas

Ok a ver si me explico mejor, que el lio que tengo en la cabeza lo he plasmado antes, no pongo la estructura de las tablas completas por que las tablas en prestashop tienen muchos campos, muestro los que interesan.



efectivamente mi intención es hacerlo en una sola consulta y los datos que quiero mostrar, son el nombre y apellidos, dirección completa, teléfono, móvil y productos comprados, de ahí que tenga que consultar a las 4 tablas a la vez.

Código MySQL:
Ver original
  1. SELECT ps_customer.id_customer, ps_customer.firstname,
  2. ps_customer.lastname, address1, address2, city, postcode, phone, phone_mobile
  3. FROM ps_customer INNER JOIN ps_address ON s_address.id_customer=ps_customer.id_customer
  4. ORDER BY postcode;

de momento con esto extraigo todos los datos excepto los productos comprados.
__________________
http://www.lynxstyle.net

En la vida como en el ajedrez, hay un reloj que marca el tiempo de cada movimiento, si lo consumes pierde (MJJG)
  #4 (permalink)  
Antiguo 04/06/2013, 14:52
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta cruzada de 4 tablas

Hola de nuevo:

Intentaste agregar todos los JOIN's como te puse en el ejemplo???

Saludos
Leo.
  #5 (permalink)  
Antiguo 04/06/2013, 16:10
 
Fecha de Ingreso: julio-2005
Mensajes: 304
Antigüedad: 18 años, 9 meses
Puntos: 4
Respuesta: Consulta cruzada de 4 tablas

Si pero no funciona, quedó así.

Código MySQL:
Ver original
  1. SELECT ps_customer.id_customer, ps_customer.firstname, ps_customer.lastname,
  2. address1, address2, city, postcode, phone, phone_mobile, product_name
  3. FROM ps_customer INNER JOIN ps_address ON ps_address.id_customer=ps_customer.id_customer
  4. INNER JOIN ps_orders ON ps_orders.id_customer=ps_customer.id_customer
  5. INNER JOIN ps_orden_detail ON ps_order_detail.id_order=ps_orders.id_order ORDER BY postcode

No entiendo el INNER con ps_orden_detail por que no tiene relacion con la tabla ps_customer como las demás.
__________________
http://www.lynxstyle.net

En la vida como en el ajedrez, hay un reloj que marca el tiempo de cada movimiento, si lo consumes pierde (MJJG)
  #6 (permalink)  
Antiguo 04/06/2013, 19: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: Consulta cruzada de 4 tablas

Tu consulta está correctamente escrita, y representa perfectamente la relación descripta en el diagrama.
Limpiándola un poco queda:
Código MySQL:
Ver original
  1.     C.`id_customer`,
  2.     C.`firstname`,
  3.     C.`lastname`,
  4.     `address1`,
  5.     `address2`,
  6.     `city`,
  7.     `postcode`,
  8.     `phone`,
  9.     `phone_mobile`,
  10.     `product_name`
  11.     `ps_customer` C
  12.         INNER JOIN
  13.     `ps_address` A ON C.`id_customer` = A.`id_customer`
  14.         INNER JOIN
  15.     `ps_orders` O ON C.`id_customer` = C.`id_customer`
  16.         INNER JOIN
  17.     `ps_orden_detail` OD ON O.`id_order` = OD.`id_order`
  18. ORDER BY `postcode`
Lo que no ves, porque no conoces los fundamentos del modelo relacional, es que existe una relación entre el ps_customer y ps_order_detail, porque esa relación es transitiva, es decir que la relación surge de la existencia de un registro en ps_order que está relacionado con el ps_customer por su id_customer.
¿Por qué dices que "no funciona"?
¿En qué sentido no funciona?
__________________
¿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 05/06/2013, 00:57
 
Fecha de Ingreso: julio-2005
Mensajes: 304
Antigüedad: 18 años, 9 meses
Puntos: 4
Respuesta: Consulta cruzada de 4 tablas

Efectivamente esta correcta, tenia yo un error que puse ps_ordeN_detail en vez de ps_ordeR_detail, con el echo ya funciona ahora a investigar el html que creo con esta consulta que no me da resultados.

gracias a los dos.
__________________
http://www.lynxstyle.net

En la vida como en el ajedrez, hay un reloj que marca el tiempo de cada movimiento, si lo consumes pierde (MJJG)

Etiquetas: join, select, tabla, tablas
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 18:04.