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 A.id_encriptado,
A.id,
A.ref,
A.titulo_1,
A.descripcion_1,
A.precio1 precio,
A.iva_incluido,
A.id_plazos_entrega,
A.id_dto,
A.id_iva,
A.comprar
articulos_subcategorias SC
WHERE id_almacen
IN(1, 2, 3, 5, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17) WHERE final
> 0) T2
ON A.id
= t2.id_articulo
SC.id_categorias =3
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).