[OFF] SQL - Selecionar registro imediatamente anterior

1,387 views
Skip to first unread message

Kico Zaninetti

unread,
Jun 18, 2007, 12:27:49 PM6/18/07
to list...@googlegroups.com
Pessoal, como não conheço nenhuma boa lista de SQL ou MySQL, vou perguntar aqui mesmo.

Criei uma view no MySQL e preciso fazer um select pra pegar o registro imediatamente anterior ao registro atual. Segue mais ou menos o esquema da view:

idmovimento
data
produto
entrada
saida

A ordem da tabela é: produto, data, idmovimento

O idmovimento não está em ordem crescente, ou seja, um idmovimento menor, pode ter uma data maior.

Exemplo de dados na ordem dos campos:

106 - 10/01/2007 - MEMÓRIA - 100 - 0
150 - 13/01/2007 - MEMÓRIA - 0 - 20
113 - 15/01/2007 - MEMÓRIA - 10 - 0
123 - 15/01/2007 - MEMÓRIA - 10 - 0
136 - 18/01/2007 - PROCESSADOR - 40 - 0
114 - 20/01/2007 - PROCESSADOR - 0 - 15

Então se eu pego o registro 114, preciso do imediatamente anterior que é o 136 e não o 113, entendem?

Obs.: preciso disso pra usar numa função para retornar o saldo total em estoque dos produtos.

Se alguém souber como fazer isso, me avise por favor. Se alguém souber um grupo bom de discussão de SQL ou MySQL também ajuda!

--
Kico Zaninetti
carpe diem


Francisco Souza

unread,
Jun 18, 2007, 3:54:28 PM6/18/07
to list...@googlegroups.com
Olá Kico, você usa um laço para exibir os dados, certo?!

Sugiro que você use um laço para guardar os dados em uma arrays, de forma que vai ser bem mais fácil fazer o que você deseja.

Imagine assim:

Em 18/06/07, Kico Zaninetti <kicoza...@gmail.com> escreveu:

Francisco Souza

unread,
Jun 18, 2007, 3:57:23 PM6/18/07
to list...@googlegroups.com
Desculpe-me, ignore o "Imagine assim:".

Francisco

Em 18/06/07, Francisco Souza <francis...@gmail.com > escreveu:

Kico Zaninetti

unread,
Jun 18, 2007, 4:13:49 PM6/18/07
to list...@googlegroups.com
Francisco, eu não vou jogar os dados para um script. Isso tudo é manipulado no banco de dados. Tenho que criar uma Stored Function para calcular o saldo em estoque de acordo com os lançamentos de entrada e saída.

De qualquer forma, eu já fiz uma gambiarra aqui que funcionou. Criei um campo saldo e rodei um script que faz esse cálculo para gravar  o valor do saldo no campo para cada lançamento.

Ainda assim preciso fazer esta função para que ao inserir, alterar ou excluir um lançamento, atualize o saldo e eu queria fazer isso direto no banco de dados.


--
Kico Zaninetti
carpe diem




Francisco Souza

unread,
Jun 18, 2007, 4:28:24 PM6/18/07
to list...@googlegroups.com
Bom, nunca vi nada parecido com isso no mySQL, mas eu aconselho então que você procure uma lista ou um fórum de mySQL, provavelmente você terá pessoas com conhecimentos mais avançados nessa área lá :D

Francisco

Kico Zaninetti

unread,
Jun 18, 2007, 4:33:08 PM6/18/07
to list...@googlegroups.com
Pois é... eu vou ter q procurar uma lista com calma...

Eu já criei uma função pra fazer isso, mas ela num tá muito boa das pernas não... meio gambiarra, comendo mto recurso da máquina... e isso pq só tenho 967 registros na tabela... no próximo lançamento vão ser uns 3000 e subindo...

Leitzke Granada

unread,
Jun 22, 2007, 8:55:55 PM6/22/07
to list...@googlegroups.com
Dae kico,
 
Ele não fica ordenado pela data dessa forma? E se tu só pegares a data imediatamente anterior a atual?
 
Abraços

 

Sergio Michels

unread,
Jun 22, 2007, 10:45:27 PM6/22/07
to list...@googlegroups.com
tem q ver q podem ter campos com a mesma data

Kico Zaninetti

unread,
Jun 25, 2007, 10:13:45 AM6/25/07
to list...@googlegroups.com
O problema é o seguinte, eu tenho que pegar o campo da última data por produto! Segue um exemplo:

tabela product_mov
idmov
idproduto
data
entrada
saida
saldo

Exemplo de dados na ordem dos campos. Coloquei o nome do produto entre () pra facilitar a visualização.

1 - 2 (Memória) - 2007-06-10 - 10 - 0 - 10
2 - 2 (Memória) - 2007-06-11 - 0 - 5 - 5
3 - 3 (CPU) - 2007-06-11 - 20 - 0 - 20
4 - 2 (Memória) - 2007-06-12 - 13 - 0 - 18
5 - 3 (CPU) - 2007-06-15 - 0 - 3 - 17

O que eu tenho que fazer é retornar a soma dos saldos de todos os produtos inferiores à data especificada. Mas eu preciso da soma apenas do registro imediatamente anterior desta data para cada produto.

Então, se eu quero a soma da média do dia 2007-06-16, eu terei que pegar o último registro de memória e cpu e somá-los.
No caso, eu pegarei os registros 4 e 5. Meu resultado será 18+17 = 35.

Se eu quero do dia 2007-06-13, eu pegarei os registros 4 e 3 e somá-los. 18+20 = 38

Entenderam o problema?


--
Kico Zaninetti
carpe diem


fredBH

unread,
Jun 25, 2007, 2:12:13 PM6/25/07
to LISTA PHP
bom... nao sei se entendi direito... mas tenta :
1) faz um select * where bla bla order by data limit 2
2) ai depois pega os 2 registros que retornarem na consulta e soma via
php mesmo

> On 6/22/07, Sergio Michels <sergiomiche...@gmail.com> wrote:
>
>
>
> > tem q ver q podem ter campos com a mesma data
>

> > On 6/22/07, Leitzke Granada <rogerdownlo...@gmail.com> wrote:
>
> > > Dae kico,
>
> > > Ele não fica ordenado pela data dessa forma? E se tu só pegares a data
> > > imediatamente anterior a atual?
>
> > > Abraços
>

> > > Em 18/06/07, Kico Zaninetti <kicozanine...@gmail.com > escreveu:


>
> > > > Pois é... eu vou ter q procurar uma lista com calma...
>
> > > > Eu já criei uma função pra fazer isso, mas ela num tá muito boa das
> > > > pernas não... meio gambiarra, comendo mto recurso da máquina... e isso pq só
> > > > tenho 967 registros na tabela... no próximo lançamento vão ser uns 3000 e
> > > > subindo...
>
> > > > --
> > > > Kico Zaninetti
> > > > carpe diem
>

> > > > On 6/18/07, Francisco Souza <franciscosso...@gmail.com > wrote:
>
> > > > > Bom, nunca vi nada parecido com isso no mySQL, mas eu aconselho
> > > > > então que você procure uma lista ou um fórum de mySQL, provavelmente você
> > > > > terá pessoas com conhecimentos mais avançados nessa área lá :D
>
> > > > > Francisco
>

> > > > > Em 18/06/07, Kico Zaninetti < kicozanine...@gmail.com > escreveu:


>
> > > > > > Francisco, eu não vou jogar os dados para um script. Isso tudo é
> > > > > > manipulado no banco de dados. Tenho que criar uma Stored Function para
> > > > > > calcular o saldo em estoque de acordo com os lançamentos de entrada e saída.
>
> > > > > > De qualquer forma, eu já fiz uma gambiarra aqui que funcionou.
> > > > > > Criei um campo saldo e rodei um script que faz esse cálculo para gravar o
> > > > > > valor do saldo no campo para cada lançamento.
>
> > > > > > Ainda assim preciso fazer esta função para que ao inserir, alterar
> > > > > > ou excluir um lançamento, atualize o saldo e eu queria fazer isso direto no
> > > > > > banco de dados.
>
> > > > > > --
> > > > > > Kico Zaninetti
> > > > > > carpe diem
>

> > > > > > On 6/18/07, Francisco Souza <franciscosso...@gmail.com > wrote:
>
> > > > > > > Desculpe-me, ignore o "Imagine assim:".
>
> > > > > > > Francisco
>

> > > > > > > Em 18/06/07, Francisco Souza < franciscosso...@gmail.com >


> > > > > > > escreveu:
>
> > > > > > > > Olá Kico, você usa um laço para exibir os dados, certo?!
>
> > > > > > > > Sugiro que você use um laço para guardar os dados em uma
> > > > > > > > arrays, de forma que vai ser bem mais fácil fazer o que você deseja.
>
> > > > > > > > Imagine assim:
>

> > > > > > > > Em 18/06/07, Kico Zaninetti <kicozanine...@gmail.com >

Kico Zaninetti

unread,
Jun 25, 2007, 2:32:17 PM6/25/07
to list...@googlegroups.com
Fred, não dá certo desse jeito. No meu caso eu tenho inumeros produtos. Além disso, do jeito que você falou, se eu tiver duas linhas consecutivas de lançamento do mesmo produto, ele vai pegar as duas, ao invés de pegar os produtos distintos.

--
Kico Zaninetti
carpe diem

Gilson

unread,
Jun 25, 2007, 3:06:03 PM6/25/07
to list...@googlegroups.com
Tenta alguma coisa mais ou menos assim:

select sum(saldo)
from product_mov
where idmov in (
select idmov
from product_mov
where data in (
select max(data)
from product_mov
where data < now()
group by idproduto))

Gilson

Em 25/06/07, Kico Zaninetti<kicoza...@gmail.com> escreveu:

Kico Zaninetti

unread,
Jun 25, 2007, 4:12:50 PM6/25/07
to list...@googlegroups.com
A query faz sentido! Mas já tem 5 minutos que tá rodando aqui e nada ainda... hehehehe

to esperando o resultado. de qq forma, valeu pela ajuda


--
Kico Zaninetti
carpe diem

Kico Zaninetti

unread,
Jun 25, 2007, 4:50:25 PM6/25/07
to list...@googlegroups.com
Não deu certo, mas eu peguei a ideia da coisa e to mexendo na query pra chegar no resultado q eu preciso.

Valeu!


--
Kico Zaninetti
carpe diem

Reply all
Reply to author
Forward
0 new messages