Ver Mensaje Individual
  #6 (permalink)  
Antiguo 25/06/2013, 11:24
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: saber que campo tengo de una tabla en otra

Hola Catpaw:

Acláranos algunos puntos, ya que no me quedan claras cómo están definidas las relaciones entre tus tablas. En primer lugar, definamos la cardinalidad de tus tablas, es decir, un registro de tu tabla t_mobiliario puede tener 0 o n fotos asignadas t_mobiliario_fotos.

Con tus datos que pones de ejemplo, veo que sólo haces la unión por el campo CLAVE, es decir, en tu JOIN, pones esto:

Código:
...
FROM t_mobiliario tm LEFT JOIN t_mobiliario_fotos tf ON tf.clave=tm.clave
...
Sin embargo observa, en tu tabla t_mobiliarios hay 4 registros que tienen la clave = 4 (con diferente sucursal y bodega)... tal como lo estás haciendo se está formando un PRODUCTO CARTESIANO entre tus tablas: Observa este script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM t_mobiliario;
  2. +------+-------+------------------+----------+--------+------------+----------+
  3. | id   | clave | descripcion      | sucursal | bodega | existencia | importe  |
  4. +------+-------+------------------+----------+--------+------------+----------+
  5. |    1 |     5 | mesa circular    |      100 |   1000 |        669 | 1169.12  |
  6. |    2 |     5 | mesa circular    |      200 |   1000 |          0 | 0        |
  7. |    3 |     4 | modulo ejecutivo |      200 |   1000 |          0 | 0        |
  8. |    4 |     4 | modulo ejecutivo |      200 |   3000 |        812 | 15481.88 |
  9. |    5 |     4 | modulo ejecutivo |      300 |   1000 |        940 | 139959.5 |
  10. +------+-------+------------------+----------+--------+------------+----------+
  11. 5 rows in set (0.03 sec)
  12.  
  13. mysql> SELECT * FROM t_mobiliario_fotos;
  14. +------+-------+----------+--------+---------------+--------------------+
  15. | id   | clave | sucursal | bodega | nombre        | ruta               |
  16. +------+-------+----------+--------+---------------+--------------------+
  17. |    1 |     4 |      200 |   1000 | clave_4_1.JPG | fotos/200/clave_4/ |
  18. |    2 |     4 |      200 |   1000 | clave_4_2.JPG | fotos/200/clave_4/ |
  19. |    3 |     4 |      200 |   1000 | clave_4_3.JPG | fotos/200/clave_4/ |
  20. |    4 |     4 |      200 |   1000 | clave_4_4.JPG | fotos/200/clave_4/ |
  21. |    5 |     4 |      200 |   1000 | clave_4_5.JPG | fotos/200/clave_4/ |
  22. |    6 |     4 |      200 |   1000 | clave_4_6.JPG | fotos/200/clave_4/ |
  23. |    7 |     4 |      200 |   1000 | clave_4_7.JPG | fotos/200/clave_4/ |
  24. +------+-------+----------+--------+---------------+--------------------+
  25. 7 rows in set (0.00 sec)
  26.  
  27. mysql> SELECT tm.id, tm.clave, tm.descripcion, tf.id, tf.nombre, tf.ruta
  28.     -> FROM t_mobiliario tm
  29.     -> LEFT JOIN t_mobiliario_fotos tf ON tf.clave=tm.clave;
  30. +------+-------+------------------+------+---------------+--------------------+
  31. | id   | clave | descripcion      | id   | nombre        | ruta               |
  32. +------+-------+------------------+------+---------------+--------------------+
  33. |    1 |     5 | mesa circular    | NULL | NULL          | NULL               |
  34. |    2 |     5 | mesa circular    | NULL | NULL          | NULL               |
  35. |    3 |     4 | modulo ejecutivo |    1 | clave_4_1.JPG | fotos/200/clave_4/ |
  36. |    3 |     4 | modulo ejecutivo |    2 | clave_4_2.JPG | fotos/200/clave_4/ |
  37. |    3 |     4 | modulo ejecutivo |    3 | clave_4_3.JPG | fotos/200/clave_4/ |
  38. |    3 |     4 | modulo ejecutivo |    4 | clave_4_4.JPG | fotos/200/clave_4/ |
  39. |    3 |     4 | modulo ejecutivo |    5 | clave_4_5.JPG | fotos/200/clave_4/ |
  40. |    3 |     4 | modulo ejecutivo |    6 | clave_4_6.JPG | fotos/200/clave_4/ |
  41. |    3 |     4 | modulo ejecutivo |    7 | clave_4_7.JPG | fotos/200/clave_4/ |
  42. |    4 |     4 | modulo ejecutivo |    1 | clave_4_1.JPG | fotos/200/clave_4/ |
  43. |    4 |     4 | modulo ejecutivo |    2 | clave_4_2.JPG | fotos/200/clave_4/ |
  44. |    4 |     4 | modulo ejecutivo |    3 | clave_4_3.JPG | fotos/200/clave_4/ |
  45. |    4 |     4 | modulo ejecutivo |    4 | clave_4_4.JPG | fotos/200/clave_4/ |
  46. |    4 |     4 | modulo ejecutivo |    5 | clave_4_5.JPG | fotos/200/clave_4/ |
  47. |    4 |     4 | modulo ejecutivo |    6 | clave_4_6.JPG | fotos/200/clave_4/ |
  48. |    4 |     4 | modulo ejecutivo |    7 | clave_4_7.JPG | fotos/200/clave_4/ |
  49. |    5 |     4 | modulo ejecutivo |    1 | clave_4_1.JPG | fotos/200/clave_4/ |
  50. |    5 |     4 | modulo ejecutivo |    2 | clave_4_2.JPG | fotos/200/clave_4/ |
  51. |    5 |     4 | modulo ejecutivo |    3 | clave_4_3.JPG | fotos/200/clave_4/ |
  52. |    5 |     4 | modulo ejecutivo |    4 | clave_4_4.JPG | fotos/200/clave_4/ |
  53. |    5 |     4 | modulo ejecutivo |    5 | clave_4_5.JPG | fotos/200/clave_4/ |
  54. |    5 |     4 | modulo ejecutivo |    6 | clave_4_6.JPG | fotos/200/clave_4/ |
  55. |    5 |     4 | modulo ejecutivo |    7 | clave_4_7.JPG | fotos/200/clave_4/ |
  56. +------+-------+------------------+------+---------------+--------------------+
  57. 23 rows in set (0.00 sec)

Observa que cada id de tu tabla t_mobiliario se une los 7 registros que tienen clave = 4 de tu tabla t_mobiliario_fotos... Esto es un producto cartesiano y por eso se están disparando tus sumas...

En primer lugar debes definir correctamente cómo están relacionadas tus tablas, es decir, considerar todas los campos que forman la llave foránea. Una vez que hagas esto, y dado que estás haciendo una agrupación, la relación entre tus tablas no debe ser de 0 a n, sino de 0 a 1... es decir, aunque un elemento del mobiliario TENGA MÁS DE UNA FOTO ASIGNADAS, tú sólo debes considerar un registro... puedes hacerlo con DISTINCT o con GROUP BY, según sea el caso...

Para el ejemplo, voy a considerar que efectivamente el campo CLAVE es el único por el que están relacionadas tus tablas... en primer lugar, para considerar sólo una foto lo puedo hacer con un DISTINCT:

Código:
mysql> SELECT DISTINCT clave FROM t_mobiliario_fotos;
+-------+
| clave |
+-------+
|     4 |
+-------+
1 row in set (0.01 sec)
Ahora sí, puedo hacer un LEFT JOIN sobre de esta subconsulta:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->    tm.clave,
  3.     ->    tm.descripcion,
  4.     ->    SUM(tm.existencia) existencia,
  5.     ->    SUM(tm.importe) importe,
  6.     ->    tm.sucursal,
  7.     ->    tm.bodega,
  8.     ->    IFNULL(tf.clave, 'no tiene foto') foto
  9.     -> FROM t_mobiliario tm
  10.     -> LEFT JOIN
  11.     ->    (SELECT DISTINCT clave FROM t_mobiliario_fotos) tf
  12.     ->    ON tm.clave = tf.clave
  13.     -> GROUP BY tm.clave
  14.     -> ORDER BY importe DESC;
  15. +-------+------------------+------------+-----------+----------+--------+---------------+
  16. | clave | descripcion      | existencia | importe   | sucursal | bodega | foto        |
  17. +-------+------------------+------------+-----------+----------+--------+---------------+
  18. |     4 | modulo ejecutivo |       1752 | 155441.38 |      200 |   1000 | 4        |
  19. |     5 | mesa circular    |        669 |   1169.12 |      100 |   1000 | no tiene foto |
  20. +-------+------------------+------------+-----------+----------+--------+---------------+
  21. 2 rows in set (0.00 sec)

Observa que la última columna agrega el código de la foto asignada o la leyenda NO TIENE FOTO...

Dale un vistazo para ver si es más o menos lo que necesitas.

Saludos
Leo.