Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Que falla en esta consulta ??!!

Estas en el tema de Que falla en esta consulta ??!! en el foro de Mysql en Foros del Web. Hola a todos quiero sacar el valor total que tengo en mi almacen restando 2 tablas de mi db y usando 3 tablas. El siguiente ...
  #1 (permalink)  
Antiguo 21/05/2011, 09:49
 
Fecha de Ingreso: febrero-2010
Mensajes: 17
Antigüedad: 14 años, 1 mes
Puntos: 0
Pregunta Que falla en esta consulta ??!!

Hola a todos quiero sacar el valor total que tengo en mi almacen restando 2 tablas de mi db y usando 3 tablas. El siguiente codigo me funciona solo cuando tengo en en las 3 tablas el mismo id de referencia .
el codigo es ::

SELECT (SUM(wm_products_quantities.new_quantity) - SUM(wm_purchased_products.purchased_article_total) ) AS stock_restante, wm_products_wall.nombre, wm_products_wall.detalles, wm_products_wall.price, wm_products_wall.image_full, wm_products_wall.fecha, wm_products_wall.article_hashid FROM wm_products_wall, wm_products_quantities, wm_purchased_products WHERE wm_products_wall.categoria = '$new_rquery_xp' AND wm_products_wall.article_hashid = wm_products_quantities.hashid_ref AND wm_products_wall.article_hashid = wm_purchased_products.purchased_article_id GROUP BY wm_products_wall.article_hashid ORDER BY stock_restante ASC

pero cuando no tengo ningun registro en la tabla wm_purchased_products y en las demás si, la consulta me devuelve el valor 0 o sea que no hay resultado que mostrar

Como seria la consulta para no obtener un respuesta nula cuando en las demas tablas tengo registro o id de referencia pero que no tengo en la tabla wm_purchased_products

He pensado usar CASE WHEN pero no se como construir la consulta

Gracias de antemano
  #2 (permalink)  
Antiguo 21/05/2011, 10:08
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Que falla en esta consulta ??!!

El problema tiene varios puntos:
- Si vas a usar un JOIN donde una de las tablas puede no tener registros relacionados con la otra, debes usar LEFT JOIN, no JOIN ni coma como sustituto.
- Si tienes que usar LEFT JOIN debes asegurarte de que la tabla de la izquierda sea la que siempre tiene al menos un registro que pueda ser contenido en la respuesta. En tu caso, es la lista de productos, no la de existencias o ventas.
- Si la respuesta final puede ser NULL, debes usar IFNULL para resolver el dato.
- Nunca indiques la relación entre las tablas en el WHERE. El parser no lo puede optimizar y obligas a MySQL a leer registros inútiles, ya que el WHERE se aplica luego de leer las tablas y por cada registro devuelto. Es muy ineficiente.
Código MySQL:
Ver original
  1.     (SUM(PQ.new_quantity) -  SUM(PP.purchased_article_total) ) stock_restante,
  2.     PW.nombre,
  3.     PW.detalles,
  4.     PW.price,
  5.     PW.image_full,
  6.     PW.fecha,
  7.     PW.article_hashid
  8.     wm_products_wall PW
  9.     LEFT JOIN
  10.     wm_products_quantities PQ ON PW.article_hashid = PQ.hashid_ref
  11.     LEFT JOIN
  12.     wm_purchased_products PP ON PW.article_hashid = PP.purchased_article_id
  13.     wm_products_wall.categoria = '$new_rquery_xp'
  14. GROUP BY PW.article_hashid
  15. ORDER BY stock_restante ASC

Tips finales:
- Trata de usar alias en las tablas, de modo de poder simplificar la lectura.
- Escribe las sentencias de forma estructurada (con indentación) para poder leer de arriba abajo toda la consulta de una forma simple, y no tener que seguir linealmente el contenido. Cuano lo haces lineal resulta confuso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/05/2011, 12:38
 
Fecha de Ingreso: febrero-2010
Mensajes: 17
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Que falla en esta consulta ??!!

muchas gracias. me sirve tu codigo. es más eficiente muchas gracias
aora viene tema como PP.purchased_article_tota es null y no hay registro no se hace la operacion. Ejemplo en el PQ.new_quantity tengo 885 y en el PP.purchased_article_tota no tengo ningun registro no me resta nada. el resultado stock_restante sale nulo

que hay ke mejorar ???¿¿
  #4 (permalink)  
Antiguo 21/05/2011, 13:15
 
Fecha de Ingreso: febrero-2010
Mensajes: 17
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Que falla en esta consulta ??!!

bueno ya esta solucionado de todas formas gracias. he usado la function IF(PP.>0,COUNT(PQ.tabla),0) y me sirve para lo que kiero hacer
  #5 (permalink)  
Antiguo 21/05/2011, 13:35
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Que falla en esta consulta ??!!

Es más eficiente usar IFNULL:
Código MySQL:
Ver original
  1. IFNULL(PP.purchased_article_tota,0)
Ten en cuenta que NULL no es un cero, no puedes usar comparaciones con operadores lógicos porque los operadores trabajan contra datos y NULL no es un dato, es un estado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 23/05/2011, 02:25
 
Fecha de Ingreso: febrero-2010
Mensajes: 17
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Que falla en esta consulta ??!!

Gracias ya lo he comprobado. muchas gracias

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:01.