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+------+-------+------------------+----------+--------+------------+----------+
| id | clave | descripcion | sucursal | bodega | existencia | importe |
+------+-------+------------------+----------+--------+------------+----------+
| 1 | 5 | mesa circular | 100 | 1000 | 669 | 1169.12 |
| 2 | 5 | mesa circular | 200 | 1000 | 0 | 0 |
| 3 | 4 | modulo ejecutivo | 200 | 1000 | 0 | 0 |
| 4 | 4 | modulo ejecutivo | 200 | 3000 | 812 | 15481.88 |
| 5 | 4 | modulo ejecutivo | 300 | 1000 | 940 | 139959.5 |
+------+-------+------------------+----------+--------+------------+----------+
+------+-------+----------+--------+---------------+--------------------+
| id | clave | sucursal | bodega | nombre | ruta |
+------+-------+----------+--------+---------------+--------------------+
| 1 | 4 | 200 | 1000 | clave_4_1.JPG | fotos/200/clave_4/ |
| 2 | 4 | 200 | 1000 | clave_4_2.JPG | fotos/200/clave_4/ |
| 3 | 4 | 200 | 1000 | clave_4_3.JPG | fotos/200/clave_4/ |
| 4 | 4 | 200 | 1000 | clave_4_4.JPG | fotos/200/clave_4/ |
| 5 | 4 | 200 | 1000 | clave_4_5.JPG | fotos/200/clave_4/ |
| 6 | 4 | 200 | 1000 | clave_4_6.JPG | fotos/200/clave_4/ |
| 7 | 4 | 200 | 1000 | clave_4_7.JPG | fotos/200/clave_4/ |
+------+-------+----------+--------+---------------+--------------------+
mysql
> SELECT tm.id
, tm.clave
, tm.descripcion
, tf.id
, tf.nombre
, tf.ruta
-> LEFT JOIN t_mobiliario_fotos tf
ON tf.clave
=tm.clave
; +------+-------+------------------+------+---------------+--------------------+
| id | clave | descripcion | id | nombre | ruta |
+------+-------+------------------+------+---------------+--------------------+
| 3 | 4 | modulo ejecutivo | 1 | clave_4_1.JPG | fotos/200/clave_4/ |
| 3 | 4 | modulo ejecutivo | 2 | clave_4_2.JPG | fotos/200/clave_4/ |
| 3 | 4 | modulo ejecutivo | 3 | clave_4_3.JPG | fotos/200/clave_4/ |
| 3 | 4 | modulo ejecutivo | 4 | clave_4_4.JPG | fotos/200/clave_4/ |
| 3 | 4 | modulo ejecutivo | 5 | clave_4_5.JPG | fotos/200/clave_4/ |
| 3 | 4 | modulo ejecutivo | 6 | clave_4_6.JPG | fotos/200/clave_4/ |
| 3 | 4 | modulo ejecutivo | 7 | clave_4_7.JPG | fotos/200/clave_4/ |
| 4 | 4 | modulo ejecutivo | 1 | clave_4_1.JPG | fotos/200/clave_4/ |
| 4 | 4 | modulo ejecutivo | 2 | clave_4_2.JPG | fotos/200/clave_4/ |
| 4 | 4 | modulo ejecutivo | 3 | clave_4_3.JPG | fotos/200/clave_4/ |
| 4 | 4 | modulo ejecutivo | 4 | clave_4_4.JPG | fotos/200/clave_4/ |
| 4 | 4 | modulo ejecutivo | 5 | clave_4_5.JPG | fotos/200/clave_4/ |
| 4 | 4 | modulo ejecutivo | 6 | clave_4_6.JPG | fotos/200/clave_4/ |
| 4 | 4 | modulo ejecutivo | 7 | clave_4_7.JPG | fotos/200/clave_4/ |
| 5 | 4 | modulo ejecutivo | 1 | clave_4_1.JPG | fotos/200/clave_4/ |
| 5 | 4 | modulo ejecutivo | 2 | clave_4_2.JPG | fotos/200/clave_4/ |
| 5 | 4 | modulo ejecutivo | 3 | clave_4_3.JPG | fotos/200/clave_4/ |
| 5 | 4 | modulo ejecutivo | 4 | clave_4_4.JPG | fotos/200/clave_4/ |
| 5 | 4 | modulo ejecutivo | 5 | clave_4_5.JPG | fotos/200/clave_4/ |
| 5 | 4 | modulo ejecutivo | 6 | clave_4_6.JPG | fotos/200/clave_4/ |
| 5 | 4 | modulo ejecutivo | 7 | clave_4_7.JPG | fotos/200/clave_4/ |
+------+-------+------------------+------+---------------+--------------------+
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 -> tm.clave,
-> tm.descripcion,
-> SUM(tm.existencia
) existencia
, -> SUM(tm.importe
) importe
, -> tm.sucursal,
-> tm.bodega,
-> IFNULL(tf.clave
, 'no tiene foto') foto
-> ON tm.clave
= tf.clave
+-------+------------------+------------+-----------+----------+--------+---------------+
| clave | descripcion | existencia | importe | sucursal | bodega | foto |
+-------+------------------+------------+-----------+----------+--------+---------------+
| 4 | modulo ejecutivo | 1752 | 155441.38 | 200 | 1000 | 4 |
| 5 | mesa circular
| 669 | 1169.12 | 100 | 1000 | no tiene foto
| +-------+------------------+------------+-----------+----------+--------+---------------+
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.