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

Consultar en tabla si hay en almacen > 0

Estas en el tema de Consultar en tabla si hay en almacen > 0 en el foro de Mysql en Foros del Web. Hola buenas tengo una consulta donde quiero encontrar si en una tabla llamada "final" es > 0 y me la muestre, pero veo que es ...
  #1 (permalink)  
Antiguo 15/07/2013, 04:56
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Consultar en tabla si hay en almacen > 0

Hola buenas tengo una consulta donde quiero encontrar si en una tabla llamada "final" es > 0 y me la muestre, pero veo que es poco optimizada y super lenta.

SELECT
articulos.id_encriptado,
articulos.id,
articulos.ref,
articulos.titulo_1,
articulos.descripcion_1,
articulos.precio1 as precio,
articulos.iva_incluido,
articulos.id_plazos_entrega,
articulos.id_dto,
articulos.id_iva,
articulos.comprar
FROM
articulos_subcategorias,
articulos
WHERE
(
articulos_subcategorias.id_articulos = articulos.id &&
articulos_subcategorias.id_categorias ='3' &&
articulos.publicado ='si' &&
articulos.tienda LIKE '%1%' &&
articulos.visualizar='inf' &&
precio1 != 0 &&
(
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '4') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '8') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '9') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '3') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '5') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '10') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '1') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '2') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '7') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '15') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '12') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '14') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '16') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '17') > 0 ||
(SELECT SUM(entradas)-SUM(salidas) as final FROM stock WHERE stock.id_articulo = articulos.id && id_almacen = '13') > 0)
)

)
ORDER BY
articulos.ordenar ASC
LIMIT
0,48

Como se podria hacer que si encuentra en algun almacen > 0 me lo muestre pero sin tantas condicionales || y más optimizada?

Muchísimas gracias
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------

  #2 (permalink)  
Antiguo 15/07/2013, 06:13
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, 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)
  #3 (permalink)  
Antiguo 15/07/2013, 07:33
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Consultar en tabla si hay en almacen > 0

Ok Muchisimas gracias mañana lo pruebo y te comento.

AND A.tienda LIKE '%1%'
En la tabla tienda tengo registros "1, 2, 3, 4" y quiero buscar el 3.¿para hacer una búsqueda como lo arias?
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------

  #4 (permalink)  
Antiguo 15/07/2013, 07:46
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, 5 meses
Puntos: 2658
Respuesta: Consultar en tabla si hay en almacen > 0

La pregunta es... ¿Esos valores están todos en el mismo campo de un único registro, o en diferentes registros de la tabla?

Pregunto eso porque en un mismo registro, un campo no debe tener más de un valor al mismo tiempo. ¿Se entiende? Si tuvieses en un registro una lista de identificadores, entonces esa tabla estaría mal diseñada.
Si ese valor es único, es simplemente buscar por ese valor con "=" o IN(), no con LIKE.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 15/07/2013, 08:02
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Consultar en tabla si hay en almacen > 0

Esos valores estan en una misma tabla. Te explico como y el por que.

En el interface pueden tener asta dos cientas tiendas en la misma base de datos donde en esa tabla separa por comas las tiendas que visualizará ese articulo.
Por ejemplo la tabla tienda 1, 3, 4, 7

Significa k ese artículo lo visualizará la tienda 1, 3, 4, 7 y así sucesivamente. Por eso con lleva esos registros en esa tabla. Y no habría ninguna manera a buscar en donde mostrar el articulo en tienda si no fuese un LIKE?

Me entiendes? Tomarías otra manera de diseñar esa tabla, con esa logica?

Muchisimas gracias por tu gran ayuda
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------

  #6 (permalink)  
Antiguo 15/07/2013, 08:15
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consultar en tabla si hay en almacen > 0

Hola syntex:

Con permiso del compañero gnzsoloyo... Tener un campo multivaluado, es decir, tener en un campo valores separados por comas está ABSOLUTAMENTE PROHIBIDO en un modelo Entidad - Relación... es un error de diseño y te traerá muchísimos dolores de cabeza

Por lo que entiendo, tienes un modelo con una serie de artículos y una serie de tiendas... para definir qué artículos se visualizan en qué tiendas no lo haces mediante un campo multivaluado, sino con una tabla de relaciones, en donde manejes el ID del artículo y el ID de la tienda que puede visualizar dicho producto:

Código:
artículos
id_articulo|descripcion_articulo
1|articulo 1
2|articulo 2
3|articulo 3

tiendas
id_tienda|descripcion_tienda
1|tienda 1
3|tienda 3
4|tienda 4
7|tienda 7

articulos_tiendas
id_articulo_tienda|id_articulo|id_tienda
1|1|1
2|1|3
3|1|4
4|1|7
5|2|1
6|3|4
7|3|7
de este modelo se desprende que el artículo 1 se visualiza en las tiendas (1,3,4 y 7), el artículo 2 sólo se visualiza en la tienda (1) y el artículo 3 se vislauiza en las tiendas (4, 7).

Si tienes oportunidad de cambiar tu modelo, hazlo y evita dolores de cabeza posteriores.

Saludos
Leo.
  #7 (permalink)  
Antiguo 15/07/2013, 08:28
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Consultar en tabla si hay en almacen > 0

Asi k sugieres crear otra tabla para hacer relaciones con ella.

Tal como indicas y quitar el campo tienda de la tabla articulos con registros de por comas.

Mas k perfecto. Crearé un indice y relacionar esa tabla con articulos con INNER JOIN .... ON

Muchisimas gracias por reportar ideas al proecto creado. Por k Hora lo tengo programado en forma spagueti y mis proyectos pasarán a mvc y así cambiar todo para tener un buen control y la aportación de ideas aportadas.
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------

  #8 (permalink)  
Antiguo 15/07/2013, 08:45
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Consultar en tabla si hay en almacen > 0

Mañana mismo comenzaré a realizar la consulta sql de la tabla almacenes con stock > 0 y crear tablas con índices para relacionar donde mostrar categorias, subcategorias, articulos etc...., dependiendo de las tiendas seleccionsdas a visualizar.

Seguramente me surgiran dudas sobre los almacenes por k la consulta sql va cogiendo el almacén mas barato asta tener el stock a 0 y así sucesivamente. Y optimizarla lo mejor posible.

Una vez montado el interface tienda y multi tiendas con mvc será todo mucho mas legible y mas rápido en actualizar cambios.



Muchisimas gracias por vuestra gran ayuda.
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------


Etiquetas: consultar, select, tabla
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 08:21.