Hola perro5128:
Si estoy en lo correcto un producto puede tener 0 o más entradas y 0 o más salidas correcto??? partiendo de este supuesto estás equivocando la estrategia para obtener el stock.
En primer lugar, al se posible que un producto no tenga entradas y/o salidas, DEBES UTILIZAR LEFT O RIGTH JOIN. El JOIN simple o INNER JOIN necesita que existan registros en ambas tablas que estás tratando de unir por lo tanto no te arrojaría resultados correctos.
Segundo, la agrupación de las entradas y salidas DEBERÁS HACERLA ANTES DE UNIRLAS CON LA TABLA DE MATERIALES. Checa este script:
Código MySQL:
Ver original+-------------+-------------+
| id_producto | descripcion |
+-------------+-------------+
| 1 | uno |
| 2 | dos |
| 3 | tres |
| 4 | cuatro |
+-------------+-------------+
+------------+-------------+----------+
| id_entrada | id_producto | cantidad |
+------------+-------------+----------+
| 1 | 1 | 10 |
| 2 | 1 | 12 |
| 3 | 2 | 20 |
| 4 | 2 | 9 |
| 5 | 3 | 15 |
+------------+-------------+----------+
+-----------+-------------+----------+
| id_salida | id_producto | cantidad |
+-----------+-------------+----------+
| 1 | 1 | 10 |
| 2 | 1 | 8 |
| 3 | 2 | 5 |
| 4 | 2 | 7 |
+-----------+-------------+----------+
-> IFNULL(E.total_entradas
, 0) entradas
, -> IFNULL(S.total_salidas
, 0) salidas
, -> IFNULL(E.total_entradas
, 0) - IFNULL(S.total_salidas
, 0) stock
-> (SELECT id_producto
, SUM(cantidad
) total_entradas
FROM entradas
-> ON P.id_producto
= E.id_producto
-> ON P.id_producto
= S.id_producto
; +-------------+-------------+----------+---------+-------+
| id_producto | descripcion | entradas | salidas | stock |
+-------------+-------------+----------+---------+-------+
| 1 | uno | 22 | 18 | 4 |
| 2 | dos | 29 | 12 | 17 |
| 3 | tres | 15 | 0 | 15 |
| 4 | cuatro | 0 | 0 | 0 |
+-------------+-------------+----------+---------+-------+
Observa que cambié los JOIN's por LEFT JOIN y que la agrupación de las entradas y salidas las realizo en una subconsulta... previa a unirla con la tabla de productos. Si esto no te sirve portea algunos datos de ejemplo de tus tablas para poder hacer pruebas.
En cuanto al comentario de truman_truman:
Cita: y no será mejor hacer una tabla referencial llamada stock y ahí poner la cantidad actial de materiales y actualizarla cuando haya entradas o salidas???
Si bien es una solución que podría servir, va en contra de las reglas de normalización de BD... ya que no deben existir campos que puedan ser calculados, pero bueno... esa es otra historia
Saludos
Leo.