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

como obtener un registro anterior en una consulta ordenada

Estas en el tema de como obtener un registro anterior en una consulta ordenada en el foro de Mysql en Foros del Web. Hola a todos..Bueno es mi primera vez que escribo en el foro, tengo un gran problema.. stoy haciendo una aplicacion web y bueno mi pregunta ...
  #1 (permalink)  
Antiguo 05/09/2009, 11:32
 
Fecha de Ingreso: septiembre-2009
Mensajes: 3
Antigüedad: 14 años, 7 meses
Puntos: 0
como obtener un registro anterior en una consulta ordenada

Hola a todos..Bueno es mi primera vez que escribo en el foro, tengo un gran problema.. stoy haciendo una aplicacion web y bueno mi pregunta es la sgt.

tengo la sgte tabla kardex ordenado por kar_fec_trans y kar_id

mi select es (select * from kardex where order by kar_fec_trans asc, kar_id asc), asi es como se va a mostrar los movimiento del kardex ya que los registros estan tomadose por fechas no por id, y la persona que ingresa puede ingresar registros con fechas pasadas, la razon de esto es el saldo del producto(kar_saldo) que se incrementaria o se decrementaria segun a lo ingresado o egresado...


Código PHP:
                
kar_id    kar_canting    kar_cantegr    kar_saldo       kar_fec_trans
66466      NULL               3.00      
-3.64           24/08/2009
71188      0.00               6.00      
-9.64           28/08/2009
71933      0.00               3.00      
-12.64          31/08/2009
74774      0.00               2.00      
-14.64          01/09/2009
74853      0.00               8.00      
-22.64          01/09/2009
75202      105.00             0.00       82.36          03
/09/2009
75817      0.00               1.00       81
,36          04/09/2009
75196      105.00             0.00      186
,36          04/09/2009 

mi pregunta va a que si existe una sentencia que me de como resultado el registro anterior una vez ordenado, por ejemplo si tengo como dato el registro con id 75202 que me de como resultado los datos del 74853

eh intentado con esto, si funcionaria cuando los datos son del registro 75202:

select * from kardex where kar_fec_trans<='$kar_fec_trans' and kar_id<$kar_id order by kar_fec_trans desc, kar_id desc limit 1

PERO QUE NO RESULTARIA PARA CUANDO LOS DATOS SON DEL REGISTRO 75196 YA QUE ME DA COMO RESULTADO EL REGISTRO 74853 Y YO NECESITO QUE ME DE EL 75817

MUCHAS GRACIAS DE ANTEMANO POR SU AYUDA...
  #2 (permalink)  
Antiguo 05/09/2009, 12:36
Avatar de mij
mij
 
Fecha de Ingreso: enero-2007
Mensajes: 70
Antigüedad: 17 años, 3 meses
Puntos: 1
Respuesta: como obtener un registro anterior en una consulta ordenada

Te confieso que no he leido toda tu consulta por falta de tiempo y porque -sin ánimo de ofender- la ortografía es mejorable. Si tienes una tabla con un campo kar_id, y lo que quieres es la mayor kar_id menor que una dada $kar_id, puedes usar la cláusula limit, que si mal no recuerdo tiene la sintaxis LIMIT X Y siendo x la fila en la que empieza e Y el nº de filas a partir de esa que mete en los resultados. Teniendo en cuenta que las filas empiezan a contarse en 0 (de lo cual no estoy seguro) nos quedaría:

select * from kardex where kar_id < $kar_id orden by kar_id limit 1,1

No lo he comprobado, pero la solución no será muy diferente
  #3 (permalink)  
Antiguo 05/09/2009, 21:29
 
Fecha de Ingreso: septiembre-2009
Mensajes: 3
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: como obtener un registro anterior en una consulta ordenada

Bueno con eso no me respondes nada... se como se usa un order by (bueno lo basico..jeje) pero yo no quiero el id anterior eso no tendria problema alguno yo quiero que asi como esta ordenado me devuelva el registro anterior...por quee¿?¿? porque lo que me interesa es el saldo anterior(kar_saldo) a ese registro...entonces el kar_id no me serviria de nada sino mas bien el kar_fec_trans (la fehca de transaccion)


eh buscado, y me parecio que esto podria dar solucion a mi problema dicen que asi como esta ordenado yo puedo crear una columna "Referencial" digamosla a si donde vaya un nuevo id ordenado y apartir de alli buscar a que id_nuevo pertence mi registro...esta consulta crearia mi nueva tabla..

select * from (SELECT @rownum := @rownum+1 as numero,kar_id, kar_saldo,
FROM kardex, (SELECT @rownum :=0) as R
WHERE prod_id_FK =4118
ORDER BY kar_fec_trans DESC , kar_id DESC) as x

Código PHP:

 numero       kar_id   kar_canting    kar_cantegr      kar_saldo           k ar_fec_trans  
      1             76873     0.00             11.00              615.84          2009
-09-04 
      2             76099       0.00            1.00               615.84          2009
-09-03 
      3             75196      105.00         0.00               615.84          2009
-09-03 
      4             75817      0.00             1.00               
-13.16          2009-09-02 
      5             75725      0.00             1.00               
-12.16          2009-09-02 
      6             71905      0.00            4.50               
-11.16           2009-08-31 
      7             71842      0.00             6.00               
-6.66            2009-08-31 
      8             71400      0.00            4.00                
-0.66            2009-08-29 
bueno esos datos son de otra parte de la tabla
  #4 (permalink)  
Antiguo 06/09/2009, 04:14
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: como obtener un registro anterior en una consulta ordenada

Creo que así:
SELECT lista2.dato FROM (SELECT @rownum:=@rownum+1 rownum, kardex.kar_id dato FROM (SELECT @rownum:=0) r1, kardex WHERE prod_id_fk = 4118 ORDER BY kar_fec_trans)lista2 WHERE lista2.rownum
<(SELECT lista.rownum FROM (SELECT @rownum:=@rownum+1 rownum, kardex.kar_id lkar_id FROM (SELECT @rownum:=0) r, kardex WHERE prod_id_fk = 4118 ORDER BY kar_fec_trans)lista WHERE lista.lkar_id = 75817) ORDER BY lista2.rownum DESC LIMIT 1
  #5 (permalink)  
Antiguo 06/09/2009, 05:11
Avatar de mij
mij
 
Fecha de Ingreso: enero-2007
Mensajes: 70
Antigüedad: 17 años, 3 meses
Puntos: 1
Respuesta: como obtener un registro anterior en una consulta ordenada

Bueno hombre, algo si que te respondí: si lo que necesitas es la tupla anterior ordenado por fecha, tienes que hacer una subconsulta para encontrar cual es la fecha que buscas (es decir, cual se corresponde con la kar_id que buscas, a la que llamé $kar_id) y despues simplemente buscar cual es la fecha anterior a esa:

SELECT * FROM `test` where kar_fec < (select kar_fec from `test` where kar_id=$kar_id) order by kar_fec DESC limit 1
  #6 (permalink)  
Antiguo 06/09/2009, 05:18
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: como obtener un registro anterior en una consulta ordenada

mij,
el problema se da cuando la fecha es la misma y hay que buscar el orden de almacenamiento. Si os soy sincero a los dos, yo lo haría con programación, aunque esa consulta que propuse creo que funciona.
  #7 (permalink)  
Antiguo 06/09/2009, 05:29
Avatar de mij
mij
 
Fecha de Ingreso: enero-2007
Mensajes: 70
Antigüedad: 17 años, 3 meses
Puntos: 1
Respuesta: como obtener un registro anterior en una consulta ordenada

Si el orden de almacenamiento no se puede deducir de ningún atributo de la tabla, entonces está mal diseñada, y no lo digo yo, lo dice Codd [1990].

Yo di por supuesto que el chronon era de 1 dia, aunque ahora que releo el post veo que hay fechas duplicadas. Reduce el chronon para ajustarse a la realidad, o bién añade una clave autonumérica que evite confusiones.

Editado: Metedura de pata: no es Codd[1990], es kauffman[2002]. El libro, para quien le interese, es:
Temporal Data and the Relational Model. Morgan Kaufmann (2002)
  #8 (permalink)  
Antiguo 06/09/2009, 09:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: como obtener un registro anterior en una consulta ordenada

mij,
probablemente sería mejor para este caso lo que recomiendas, un campo de fecha-hora distintivo, uno de tipo timestamp, del que se podría deducir el orden de almacenamiento y que permitiría luego ordenar por él y resolver este problema. Creo que ese es un buen consejo.
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 16:09.