Comunidad de diseño web y desarrollo en internet online

Recomendaciones sobre consulta sql

Citar            
MensajeEscrito el 04 Sep 2009 06:34 pm
Recomendaciones sobre consulta SQL

Tengo dos tablas ( TBL.FACTURAS | TBL.ESTADOS ), tbl.estados contiene los estados de las facturas, estos pueden ser desde el 1 hasta el 10 (1 = factura creada, 2 = factura despachada,3 = factura recibida,4 = facturan rechazada,5,6,7, 8 = factura anulada, 9 = factura pagada)

El problema que tengo es que necesito crear una consulta SQL para filtrar las facturas por el estado en que se encuentre. Ósea una factura puede tener más de un estado, pero necesito filtrar por el último estado ingresado.-

EJ.:

Código :

TBL.FACTURAS
ID_FACTURA   NRO   ID_CLIENTE   ...OTROS

TBL.ESTADOS
ID_ESTADO   ID_FACTURA   ESTADO   TIME   OBS

Lo que también podría hacer es agregar a la "TBL.FACTURAS" un campo llamado estado, él que vaya modificando (Guardar el último estado ingresado.-), pero por lo que entiendo esto no es adecuado hacer.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie8
Citar            
MensajeEscrito el 04 Sep 2009 10:31 pm

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 05 Sep 2009 01:28 am
Gracias Inyaka, si tengo una consulta hecha, pero quiero mejorarla (optimatizarla) ya que en la tabla TBL.ESTADOS son gran cantidad de datos, es de 1 a muchos.

La consulta es la siguiente

Código :

SELECT
   `FA`.`nro_factura`,
   MAX(`ES`.`fechamodificacion`) AS FM
   FROM `facturas` AS `FA`
   INNER JOIN `estatus` AS `ES` ON ( `ES`.`status` BETWEEN 0 AND 9 ) AND `FA`.`Idfactura` = `ES`.`Idfactura`
   GROUP BY `FA`.`Idfactura` ASC
   HAVING MAX(`ES`.`status`) <= 8***
   LIMIT 100


*** numero a filtrar
Esta consulta me funciona bien, pero la estoy probando con pocos datos. No se si con muchos datos funcionara igual que ahora.-

De todas maneras cualquier sugerencia bienvenida.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie8
Citar            
MensajeEscrito el 05 Sep 2009 01:35 am
ok, si quieres optimizar deberás colocar los índices correctos, te explico, todo campo que este en un JOIN debe ser un indice, comúnmente esto pasa por que lo que se usa para unir tablas son PK

además veo que estas poniendo la condición en el join y no en el WHERE donde debe ir la condicion, usa el JOIN solo para unir las tablas

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 05 Sep 2009 02:01 am
Un join puede tener condiciones igual que un where, claro cuando sea necesario...

Lo que yo veo es que tiene problema en el modelo (planteamiento de las tablas).

A mi parecer, una factura tiene estados y no un estado tiene facturas.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 05 Sep 2009 02:05 am
Por cierto, la relación N:M (muchos a muchos) se crea una tercera tabla.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 05 Sep 2009 03:18 am

Maikel escribió:

A mi parecer, una factura tiene estados y no un estado tiene facturas.


Lo que explique fue que una factura tenia estados :S

Muchas Gracias, si tengo los indices hechos.-
Esta tabla es 1:N (uno a muchos) ya que una factura tiene estados. Por lo que se cuando la condicion se pone en el JOIN para filtrar y unir a la vez, y no unir para luego filtrar.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie8
Citar            
MensajeEscrito el 05 Sep 2009 04:15 pm
Una factura tiene estado es así:

Código :

TBL.FACTURAS
ID_FACTURA  ID_ESTADO NRO   ID_CLIENTE     ...OTROS

TBL.ESTADOS
ID_ESTADO    ESTADO   TIME   OBS


Una factura tiene muchos estados así:

Código :

TBL.FACTURAS
ID_FACTURA   NRO   ID_CLIENTE   ...OTROS


TBL.FACTURAS_ESTADOS
ID_FACTURA   ID_ESTADO


TBL.ESTADOS
ID_ESTADO    ESTADO   TIME   OBS


En facturas_estados puedes poner otros campos si lo deseas, el tiempo por ejemplo u otro dato que ocurra por la relación de factura y estado.

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 05 Sep 2009 05:11 pm
Es correcto maikel, cometí una omisión si hay una tercera tabla en donde tengo los nombres de los estados.- Realmente es como me expones:

Código :

TBL.FACTURAS
ID_FACTURA   NRO   ID_CLIENTE   ...OTROS


TBL.FACTURAS_ESTADOS
ID_FACTURA   ID_ESTADO


TBL.ESTADOS
ID_ESTADO    ESTADO   TIME   OBS


TBL.FACTURAS : Donde se guarda toda la información de las facturas
TBL.FACTURAS_ESTADOS : Donde se guarda todos los cambios de estados que sufre una factura
TBL.ESTADOS : Esta es la tabla que omití, en Donde defino cada uno de los estados del 1 al 9.-

La consulta que expuse es la unión de las tablas TBL.FACTURAS y TBL.FACTURAS_ESTADOS. Ya que debo filtrar las facturas según el ultimo estado ingresado.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie8
Citar            
MensajeEscrito el 06 Sep 2009 05:06 pm
Creo que en FACTURAS_ESTADOS deberias guardar el TIMESTAMP cada vez que insertas un nuevo registro, si es que te preocupa saber la cronologia de los estados de una factura. Asi tu consulta se facilitar ordenando por ese campo timestamp.


saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 07 Sep 2009 11:38 pm
Gracias, por sus recomendaciones, luego cuento como va.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.