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

Consulta a una tabla sobre otra tabla filtrada

Estas en el tema de Consulta a una tabla sobre otra tabla filtrada en el foro de Mysql en Foros del Web. Buenos dias, compañeros del foro. Deseo crear una consulta sobre una tabla de transacciones, basada en ltems filtrados de otra tabla. Me explico: Tengo la ...
  #1 (permalink)  
Antiguo 11/11/2012, 12:04
 
Fecha de Ingreso: marzo-2012
Mensajes: 53
Antigüedad: 12 años, 1 mes
Puntos: 3
Consulta a una tabla sobre otra tabla filtrada

Buenos dias, compañeros del foro.
Deseo crear una consulta sobre una tabla de transacciones, basada en ltems filtrados de otra tabla. Me explico:

Tengo la tabla clientes con sus campos codigo,nombre, y tengo la tabla transacc con sus campos codigo,fecha,debe,haber.

Ahora bien, lo que necesito hacer es que una vez seleccionados algunos clientes de la tabla clientes, que la consulta me presente solo las transacciones de esos clientes filtrados.

He logrado construir el siguiente codigo, pero es DEMASIADO lentísimo (tarda 15 Secs en presentar 600 reqistros desde una tabla de 40.000 regs.

Código MySQL:
Ver original
  1. SELECT Codigo,fecha,debe,haber FROM transacc  
  2. WHERE codigo IN
  3.     (SELECT codigo FROM clientes
  4.      WHERE codigo='1210004099' OR codigo='1210003099')
  5.      ORDER BY codigo ;

Alguno de ustedes puede ayudarme a agilizar esta consulta?
Gracias de antemano.

Saludos.
  #2 (permalink)  
Antiguo 11/11/2012, 12:43
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: Consulta a una tabla sobre otra tabla filtrada

1) Quita el ORDER BY. En ese contexto es innecesario, irrelevante y destruye la performance del sistema, ya que es primer campo y la subconsulta lo usa de PK.

2) Crea un indice en la tabla transacciones sobre el campo CODIGO.
Las cláusulas ORDER BY y GROUP BY se debe usar si y sólo si es absolutamente necesario, y de ser posible sobre campos donde shaya indices definidos.

3) Si Codigo es columna numérica (INT, SMALLINT, BIGINT, etc), no la pongas entre apóstrofes, los apóstrofos se usan para cadenas de texto, no para números. Eso obliga a MySQL a realizar una conversión implícita innecesaria, que también quita performance.

4) Usa IN y no OR para consultar N valores referidos al mismo campo. Es más eficiente.
Código MySQL:
Ver original
  1. SELECT Codigo,fecha,debe,haber FROM transacc  
  2. WHERE codigo IN
  3.     (SELECT codigo FROM clientes
  4.      WHERE codigo IN(1210004099, 1210003099)
  5. ORDER BY codigo;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 11/11/2012 a las 12:51
  #3 (permalink)  
Antiguo 12/11/2012, 07:57
 
Fecha de Ingreso: marzo-2012
Mensajes: 53
Antigüedad: 12 años, 1 mes
Puntos: 3
Respuesta: Consulta a una tabla sobre otra tabla filtrada

gnzsoloyo, gracias por responder.
Ciertamente lo del ORDER BY ya lo habia notado. El caso es que necesito que el resultado de la consulta se muestre ordenado por codigo. El IN en vez del OR mejoró levemente la perfomance.

Voy a crear el indice mencionado para probar. Te comento después.
Gracias, nuevamente.
  #4 (permalink)  
Antiguo 12/11/2012, 08:25
 
Fecha de Ingreso: marzo-2012
Mensajes: 53
Antigüedad: 12 años, 1 mes
Puntos: 3
Respuesta: Consulta a una tabla sobre otra tabla filtrada

gnzsoloyo.
Durante el dia de ayer y la mañana de hoy, estuve probando varios codigos, a la vez, hasta que di con el que necesito. Lo dejo aquí, por si le es útil a alguien mas.

Cabe mencionar que lleva la sentencia IN que me indicaste.

Código MySQL:
Ver original
  1. SELECT a.codigo, a.nombre, b.debe, b.haber, b.fecha FROM clientes AS a
  2.  INNER JOIN transacc AS b ON b.codigo=a.codigo
  3.  WHERE a.codigo IN('1210004099','1210003099')
  4.   ORDER BY a.codigo, b.fecha;
Nuevamente, gracias.

Saludos.

Etiquetas: select, tabla, campos
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 06:53.