Ver Mensaje Individual
  #14 (permalink)  
Antiguo 12/07/2012, 12:06
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: consulta a 3 tablas

Hola yeyowave:

También voy a meter mi cuchara a riesgo de que me pase lo que a gnzsoloyo .

En primer lugar, creo que te estás equivocando con el tono de tus respuestas hacia gnzsoloyo. Te aseguro que su intención siempre ha sido la de tratar de ayudar y basta con ver el número de mensajes y el karma que le han dado los usuarios para darse cuenta que es así, sin embargo, yo mismo tuve un "problema" similar por el tono que suele utilizar en sus post's. Sin embargo, creo en aquella ocasión pudimos aclarar la situación y darnos cuenta que todo fue un malentendido, como lo es ahora, desde mi punto de vista.

Lo que gnzsoloyo quería hacer notar de manera muy acertada por cierto es que CON LOS DATOS QUE PONES DE EJEMPLO, LA PRIMER CONSULTA QUE PONES DEBERÍA FUNCIONAR. Te pido dos minutos de tu tiempo para que cheques este script (que es básicamente el mismo que pone gnzsoloyo). En tu primer post dices esto:

Cita:
pero ahora necesito mostrar el nombre y el stock del producto, como meto un left join? puesto que si lo pongo asi.

select stc.id_prod,pr.nombre,stc.f_actualizado,count(stod .id_prod) as esperan from avstock_cab stc left join productos pr on pr.id = stc.id_prod inner join avstock_det stod on stc.id_prod = stod.id_prod group by stc.id_prod

0, '', '20010230', 6 <---- no son 6, son 3 los que tienen que salir
1641, 'producto demo', '20120706', 4
Observa con atención este script, es la recreación de tus tablas de ejemplo CON LA MISMA CONSULTA QUE ESTÁS TRATANDO DE EJECUTAR:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM productos;
  2. +------+---------------+-------+
  3. | id   | nombre        | stock |
  4. +------+---------------+-------+
  5. | 1641 | producto demo |    25 |
  6. +------+---------------+-------+
  7. 1 row in set (0.01 sec)
  8.  
  9. mysql> SELECT * FROM avstock_cab;
  10. +---------+------------+
  11. | id_prod | ultima_sol |
  12. +---------+------------+
  13. |       0 | 20010230   |
  14. |    1641 | 20120706   |
  15. +---------+------------+
  16. 2 rows in set (0.00 sec)
  17.  
  18. mysql> SELECT * FROM avstock_det;
  19. +---------+------------------+
  20. | id_prod | email            |
  21. +---------+------------------+
  22. |    1641 | [email protected] |
  23. |    1641 | [email protected] |
  24. |    1641 | [email protected] |
  25. |    1641 | [email protected] |
  26. |       0 | [email protected] |
  27. |       0 | [email protected] |
  28. |       0 | [email protected] |
  29. +---------+------------------+
  30. 7 rows in set (0.00 sec)
  31.  
  32. mysql> SELECT
  33.     ->   stc.id_prod,pr.nombre,
  34.     ->   #stc.f_actualizado,
  35.     ->   COUNT(stod .id_prod) AS esperan
  36.     -> FROM avstock_cab stc
  37.     -> LEFT JOIN productos pr ON pr.id = stc.id_prod
  38.     -> INNER JOIN avstock_det stod ON stc.id_prod = stod.id_prod
  39.     -> GROUP BY stc.id_prod;
  40. +---------+---------------+---------+
  41. | id_prod | nombre        | esperan |
  42. +---------+---------------+---------+
  43. |       0 | NULL          |       3 |
  44. |    1641 | producto demo |       4 |
  45. +---------+---------------+---------+
  46. 2 rows in set (0.00 sec)

Observa que el campo #stc.f_actualizado, está comentado porque no aparece en la estructura original de tus tablas. Con esta consulta el resultado ES EL QUE QUIERES OBTENER, en otras palabras NO ES POSIBLE DETERMINAR CÓMO ES QUE OBTUVISTE UN 6 COMO RESULTADO. Eso es lo que gnzsoloyo quería hacer notar, pero no estoy seguro de si entendiste lo que quería decir.

En cuanto al modelo de BD, creo que gnzsoloyo olvidó que en ocasiones no es posible modificarlo, pues no está en nuestras manos hacerlos INDEPENDIENTEMENTE DE QUE SEA UNA "BASURA" O NO, "Jerarquía mata intelecto" dijo alguna vez uno de mis maestros. Pero Creo que sería conveniente que si fuera el caso y pudieras modificar tus tablas lo hagas. Estoy de acuerdo en que puede haber una inconsistencia de datos por la manera en que tienes definidas tus tablas.

En fin, no quiero alargar más el tema, como comentario final te pediría nuevamente que tengas cuidado en la manera en que respondes un post, INDEPENDIENTEMENTE SI FUISTE OFENDIDO O NO. Un Gran Maestro, dijo alguna vez:

Cita:
"Cuando alguien te de una bofetada en la mejilla, preséntale la otra"
Si seguimos la regla del OJO POR OJO, el mundo se llenará de tuertos.

Y gnzsoloyo, alguna vez te dije también que tus palabras en ocasiones suelen ser duras y ofensivas, aunque tu no lo pienses... creo que no está tampoco de más revisar un poco lo que escribimos no crees???

Saludos a todos
Leo.