Ver Mensaje Individual
  #7 (permalink)  
Antiguo 06/07/2012, 18:17
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: consulta a 3 tablas

Dejando de lado tu ditraba, que ya te he respondido debidamente por vía administrativa, paso a demostrarte rápidamente que si me atengo a la descripción de tus tablas, y a los datos aportados en el primer post, la consulta que proponías inicialmente forzosamente debería dar corretamente el resultado.
Esta sería la creación de las tablas. No defino las FK que deberían ser necesarias, porque generaría un error al no existir el producto dado en la tabla, tal y como te lo plantee:
Código MySQL:
Ver original
  1. mysql> mysql> USE TEST;
  2. Database changed
  3. mysql>
  4. mysql> DROP TABLE IF EXISTS productos;
  5. Query OK, 0 rows affected (0.00 sec)
  6.  
  7. mysql> DROP TABLE IF EXISTS avstock_cab;
  8. Query OK, 0 rows affected (0.00 sec)
  9.  
  10. mysql> DROP TABLE IF EXISTS avstock_det;
  11. Query OK, 0 rows affected (0.00 sec)
  12.  
  13. mysql>
  14. mysql> CREATE TABLE IF NOT EXISTS productos(
  15.     ->     id INT UNSIGNED,
  16.     ->     nombre VARCHAR(100),
  17.     ->     stock INT UNSIGNED);
  18. Query OK, 0 rows affected (0.03 sec)
  19.  
  20. mysql>
  21. mysql> CREATE TABLE IF NOT EXISTS  avstock_cab(
  22.     ->     id_prod INT UNSIGNED,
  23.     ->     ultima_sol VARCHAR(50));
  24. Query OK, 0 rows affected (0.00 sec)
  25.  
  26. mysql> CREATE TABLE IF NOT EXISTS  avstock_det(
  27.     ->     id_prod INT UNSIGNED,
  28.     ->     email VARCHAR(255));
  29. Query OK, 0 rows affected (0.01 sec)
  30.  
  31. mysql> INSERT INTO productos
  32.     -> VALUES(1641, 'producto demo',25);
  33. Query OK, 1 row affected (0.01 sec)
  34.  
  35. mysql> INSERT INTO avstock_cab
  36.     -> VALUES
  37.     ->     (0, '20010233'),
  38.     ->     (1641, '20120706');
  39. Query OK, 2 rows affected (0.00 sec)
  40. Records: 2  Duplicates: 0  Warnings: 0
  41.  
  42. mysql> INSERT INTO avstock_det
  43.     -> VALUES
  44.     ->     (1641, '[email protected]'),
  45.     ->     (1641, '[email protected]'),
  46.     ->     (1641, '[email protected]'),
  47.     ->     (1641, '[email protected]'),
  48.     ->     (0, '[email protected]'),
  49.     ->     (0, '[email protected]'),
  50.     ->     (0, '[email protected]');
  51. Query OK, 7 rows affected (0.08 sec)
  52. Records: 7  Duplicates: 0  Warnings: 0

Hecho esto, pasemos a tu consulta, que he escrito nada más que en una forma estructurada, sin sacarle ni ponerle nada:
Código MySQL:
Ver original
  1. mysql>
  2. mysql> SELECT
  3.     ->     stc.id_prod,
  4.     ->     stc.ultima_sol,
  5.     ->     count(stod.id_prod) esperan
  6.     -> FROM
  7.     ->     avstock_cab stc
  8.     ->     INNER JOIN avstock_det stod
  9.     ->     ON stc.id_prod = stod.id_prod
  10.     -> GROUP BY stc.id_prod;
  11. +---------+------------+---------+
  12. | id_prod | ultima_sol | esperan |
  13. +---------+------------+---------+
  14. |       0 | 20010230   |       3 |
  15. |    1641 | 20120706   |       4 |
  16. +---------+------------+---------+
  17. 2 rows in set (0.00 sec)
Como es notorio, el resultado obtenido indica para el primer producto la cantidad de tres (3) que es precisamente lo que dices que se debe obtener, y que yo te dije que era lo que debía darte.
Ahora bien, probemos entonces agregando una operación más, con el id de producto en cero (0):
Código MySQL:
Ver original
  1. mysql> INSERT INTO avstock_cab
  2.     -> VALUES
  3.     ->     (0, '20010234');
  4. Query OK, 1 row affected (0.06 sec)
O sea: Mismo producto, solicitud diferente.
El resultado:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     stc.id_prod,
  3.     ->     stc.ultima_sol,
  4.     ->     count(stod.id_prod) esperan
  5.     -> FROM
  6.     ->     avstock_cab stc
  7.     ->     INNER JOIN avstock_det stod
  8.     ->     ON stc.id_prod = stod.id_prod
  9.     -> GROUP BY stc.id_prod;
  10. +---------+------------+---------+
  11. | id_prod | ultima_sol | esperan |
  12. +---------+------------+---------+
  13. |       0 | 20010233   |       6 |
  14. |    1641 | 20120706   |       4 |
  15. +---------+------------+---------+
  16. 2 rows in set (0.00 sec)
¿Quedó claro?
Se entiende el problema?
El error consiste en que el agrupamiento debería ser incluyendo el numero de solicitud, para evitar que se sumen valores incorrectamente.
Pero por sobre todo: No existe un error en la cuenta, sino que hay un registro adicional con ese ID del producto, que no pertenece al cálculo.

Fuera de eso, mantengo todo lo dicho, especialmente respecto a que no poner una restricción FK es diseñar basura.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)