Ver Mensaje Individual
  #2 (permalink)  
Antiguo 15/07/2013, 06:13
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: Consultar en tabla si hay en almacen > 0

Francamente, pocas veces he visto postada una consulta tan ineficiente. Si hay algo que se debe evitar es poner subcosnutlas de en el WHERE, ya que no sólo no es optimizable, sino que además se ejecuta una vez por cada registro de la consulta mayor resultante, en especial en el caso que estás proponiendo.
Debes pensar que si tienes N subconsultas condicionadas por OR, y la única diferencia entre es el valor de un parámetro, debes entonces poder agruparlas tal que realice una distinción por el ID usado, y para eso existe... el GROUP BY ¿No te parece?
Yo propondría para empezar algo como:
Código MySQL:
Ver original
  1.     A.id_encriptado,
  2.     A.id,
  3.     A.ref,
  4.     A.titulo_1,
  5.     A.descripcion_1,
  6.     A.precio1 precio,
  7.     A.iva_incluido,
  8.     A.id_plazos_entrega,
  9.     A.id_dto,
  10.     A.id_iva,
  11.     A.comprar
  12.     articulos_subcategorias SC
  13.     INNER JOIN articulos A ON     SC.id_articulos = A.id
  14.     INNER JOIN
  15.         (SELECT id_articulo
  16.         FROM
  17.             (SELECT id_articulo, (SUM(entradas)-SUM(salidas)) final
  18.             FROM stock
  19.             WHERE id_almacen IN(1, 2, 3, 5, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17)
  20.             GROUP BY id_articulo) T1
  21.         WHERE final > 0) T2 ON A.id = t2.id_articulo
  22.     SC.id_categorias =3
  23.     AND A.publicado ='si'
  24.     AND A.tienda LIKE '%1%'
  25.     AND A.visualizar='inf'
  26.     AND precio1 > 0
  27. ORDER BY A.ordenar ASC
  28. LIMIT 0,48
No me gusta tampoco ese LIKE, porque un LIKE en esas condiciones provocará que lea toda la tabla Artículos. Y eso es una mala práctica.
Tampoco es bueno hacer una búsqueda por != precio, porque no puede distinguir cuál buscas y leerá también toda la tabla.
Otra regla básica es jamás poner entre apóstrofos un valor numérico si el campo es numérico, porque generará una conversión implícita, y a nivel programación esconderá los errores de manejo de variables que existan (es más productivo dejar que caiga en error por defecto de sintaxis provocada por un mal uso de variables).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)