Harold,
Como usaria um sub-select para isso…
Tem como me ajudar?
Harold,
Como usaria um sub-select para isso…
Tem como me ajudar?
você de certa forma fez 2 sub-selects no from do select principal.
faça o sub-select retornando a data e hora de saída.
para executar melhor a avaliação precisaria ter a modelagem dos dados (populados) para efetuar testes, pois na teoria tudo funciona, mas na pratica nem sempre…
Quando chegar em casa te envio
Como Harold falou … precisaria pegar o registro anterior.
Como tem que ser generico para cada registro … teria que pegar o registro anterior …(se a ordem for pela chave primaria)… so dar um select pegando o registro anterior onde a chave for menor que a atual com limit 0,1 pra trazer apenas 1 registro … espero que de pra entender :-p
se tenho
select codigo, nome from clientes
o registro anterior a esse seria:
select
cli1.codigo,
cli1.nome,
(SELECT cli2.codigo FROM clientes where cli2.codigo < cli1.codigo order by cli2.codigo DESC limit 0,1)
from
clientes
order by
cli1.codigo ASC
juro que fiz de cabeca agora e foi a primeira solucao que me veio(creio que esta correto) … depois o pessoal fala mais sugestao ai …
Diogo,
Vou testar sua solução e já post se deu certo…
Valeu…
Diogo
Usando a minha tabela seria mais ou menos isso como você fez acima, mas está dando erro #1241 - Operand should contain 1 column(s)
SELECT
gm.Idaut,
gm.Data,
gm.Idcarro,
gm.HoraSaida,
gm.Sentido,
(SELECT g.Idaut,g.HoraSaida, timediff(time(g.HoraSaida),time(gm.HoraSaida)) FROM guiasmov g where g.Idaut < gm.Idaut order by g.Idaut DESC limit 0,1) AS INTERVALOI
FROM guiasmov gm
WHERE
gm.Data = '2009-09-01' AND
gm.Idcarro Between 100 AND 130 AND
gm.Idlinha = 13
AND gm.Sentido = 0
É pq subselect, para funcionar como 1 campo, deve retornar apenas 1 campo no select.
SELECT timediff(time(g.HoraSaida),time(gm.HoraSaida)) FROM guiasmov g where g.Idaut < gm.Idaut order by g.Idaut DESC limit 0,1
Diogo,
com esse select
SELECT
gm.Idaut AS ID1,
TIME(gm.HoraSaida) as HORAID1,
(SELECT g.Idaut FROM guiasmov g where g.Idaut < gm.Idaut order by g.Idaut DESC limit 0,1) AS ID2,
(SELECT TIME(g2.HoraSaida) FROM guiasmov g2 where g2.Idaut = Id2) as HORAID2
FROM guiasmov gm
order by
gm.Idaut DESC
LIMIT 0,10
Consegui esse resultado, só não consegui o TIMEDIFF
212220;"20:42:00";212219;"20:07:00"
212219;"20:07:00";212218;"19:23:00"
212218;"19:23:00";212217;"18:27:00"
212217;"18:27:00";212216;"16:51:00"
212216;"16:51:00";212215;"16:17:00"
212215;"16:17:00";212214;"15:28:00"
212214;"15:28:00";212213;"14:56:00"
212213;"14:56:00";212212;"14:18:00"
212212;"14:18:00";212211;"13:39:00"
212211;"13:39:00";212210;"12:56:00"
o timediff funciona direitinho, mas acho que temque passar com a data junto:
SELECT TIMEDIFF(‘2008-12-31 23:59:59.000001’,
-> ‘2008-12-30 01:01:01.000002’);
-> ‘46:58:57.999999’
Harold,
Tá funcionando direitinho com o TIMEDIFF… porém nem tudo é perfeito…
Os ids não são sequenciais…
Select:
SELECT
gm.Idaut AS IDIDA,
gm.IdGuia AS GIDA,
DATE_FORMAT(gm.Data,'%d/%m/%Y') as DATAI,
gm.Viagem as ViagensI,
gm.Turma as TURMAI,
gm.Idcarro as CARROI,
gm.IdLinha as LINHAI ,
gm.Sentido as IDA,
DATE_FORMAT(gm.HoraSaida,'%H:%i') as SAIDAI,
DATE_FORMAT(gm.HoraChegada,'%H:%i')as CHEGADAI,
DATE_FORMAT(gm.Tempo,'%H:%i') as TEMPOI,
gm.Passageiros as PAXI,
(SELECT gm1.Idaut FROM guiasmov gm1 where gm1.Idaut < gm.Idaut order by gm.Idaut DESC limit 0,1) AS ID2,
(SELECT TIMEDIFF(DATE_FORMAT(gm.HoraSaida,'%H:%i'),DATE_FORMAT(HoraSaida,'%H:%i')) FROM guiasmov where Idaut = Id2) AS INTERVALOIDA
FROM guiasmov gm
WHERE
gm.Data = '2009-09-01' AND
gm.Idcarro Between 100 AND 130 AND
gm.Idlinha = 13
AND gm.Sentido = 0
ORDER BY
SAIDAI
Resultado:
"IDIDA""GIDA""DATAI""ViagensI""TURMAI""CARROI""LINHAI""IDA""SAIDAI""CHEGADAI""TEMPOI""PAXI""ID2""INTERVALOIDA"
198495 63413 01/09/2009 1 1 104 13 0 03:58 10:03 06:05 291 198494 -15:32:00
198731 63457 01/09/2009 1 1 128 13 0 04:08 05:08 01:00 12 198730 -17:27:00
198620 63432 01/09/2009 1 1 114 13 0 04:30 05:29 00:59 17 198619 -18:19:00
198581 63425 01/09/2009 1 1 111 13 0 04:32 05:32 01:00 39 198580 -09:12:00
198705 63453 01/09/2009 1 1 126 13 0 05:21 06:16 00:55 48 198704 -16:55:00
198485 63411 01/09/2009 1 1 103 13 0 05:41 06:32 00:51 51 198484 -15:18:00
198733 63457 01/09/2009 2 1 128 13 0 06:01 07:14 01:13 56 198732 00:53:00
198699 63451 01/09/2009 1 1 125 13 0 06:27 09:20 02:53 194 198698 -09:57:00
Diogo,
Tem alguma ideia de como fazer usando esse SELECT?
Teria que ser :
198731 - 198495
…
O que eu tava falnado era isso aqui:
SELECT
gm.Idaut,
gm.Data,
gm.Idcarro,
gm.HoraSaida,
gm.Sentido,
(SELECT timediff(time(g.HoraSaida),time(gm.HoraSaida)) FROM guiasmov g where g.Idaut < gm.Idaut order by g.Idaut DESC limit 0,1) AS INTERVALOI
FROM guiasmov gm
WHERE
gm.Data = '2009-09-01' AND
gm.Idcarro Between 100 AND 130 AND
gm.Idlinha = 13
AND gm.Sentido = 0
ou
SELECT
gm.Idaut,
gm.Data,
gm.Idcarro,
gm.HoraSaida,
gm.Sentido,
timediff(
(SELECT
time(g.HoraSaida)
FROM
guiasmov g
where
g.Idaut < gm.Idaut
order by
g.Idaut DESC limit 0,1
),time(gm.HoraSaida)) AS INTERVALOI
FROM
guiasmov gm
WHERE
gm.Data = '2009-09-01' AND
gm.Idcarro Between 100 AND 130 AND
gm.Idlinha = 13 AND
gm.Sentido = 0
a ideia …
Diogo,
Como citei acima o problema é que os Ids não são sequenciais…
Diogo,
Tem alguma idéia para IDS não sequenciais?
É isso que to dizendo … o que vai importar e muito eh saber a ordem … pois se nao o anterior vai pegar errado.
Qual a ordem que voce quer usar? Mostra o order by original e o interno vai ser ele ao contrario ja que voce quer pegar apenas o primeiro da lista… pra poder fazer o where direito …
Diogo,
O select da aplicação é esse com o ORDER BY pela HORAI
SELECT
gm.Idaut AS IDIDA,
gm.IdGuia AS GIDA,
DATE_FORMAT(gm.Data,'%d/%m/%Y') as DATAI,
gm.Viagem as ViagensI,
gm.Turma as TURMAI,
gm.Idcarro as CARROI,
gm.IdLinha as LINHAI ,
gm.Sentido as IDA,
DATE_FORMAT(gm.HoraSaida,'%H:%i') as SAIDAI,
DATE_FORMAT(gm.HoraChegada,'%H:%i')as CHEGADAI,
DATE_FORMAT(gm.Tempo,'%H:%i') as TEMPOI,
gm.Passageiros as PAXI,
(SELECT gm1.Idaut FROM guiasmov gm1 where gm1.Idaut < gm.Idaut order by gm.Idaut DESC limit 0,1) AS ID2,
(SELECT TIMEDIFF(DATE_FORMAT(gm.HoraSaida,'%H:%i'),DATE_FORMAT(HoraSaida,'%H:%i')) FROM guiasmov where Idaut = Id2) AS INTERVALOIDA
FROM guiasmov gm
WHERE
gm.Data = '2009-09-01' AND
gm.Idcarro Between 100 AND 130 AND
gm.Idlinha = 13
AND gm.Sentido = 0
ORDER BY
SAIDAI
E o resultado esse:
"IDIDA""GIDA""DATAI""ViagensI""TURMAI""CARROI""LINHAI""IDA""SAIDAI""CHEGADAI""TEMPOI""PAXI""ID2""INTERVALOIDA"
198495 63413 01/09/2009 1 1 104 13 0 03:58 10:03 06:05 291 198494 -15:32:00
198731 63457 01/09/2009 1 1 128 13 0 04:08 05:08 01:00 12 198730 -17:27:00
198620 63432 01/09/2009 1 1 114 13 0 04:30 05:29 00:59 17 198619 -18:19:00
198581 63425 01/09/2009 1 1 111 13 0 04:32 05:32 01:00 39 198580 -09:12:00
198705 63453 01/09/2009 1 1 126 13 0 05:21 06:16 00:55 48 198704 -16:55:00
198485 63411 01/09/2009 1 1 103 13 0 05:41 06:32 00:51 51 198484 -15:18:00
198733 63457 01/09/2009 2 1 128 13 0 06:01 07:14 01:13 56 198732 00:53:00
198699 63451 01/09/2009 1 1 125 13 0 06:27 09:20 02:53 194 198698 -09:57:00
voce ta falando que eh HORAI, mas no seu select tem:
ORDER BY
SAIDAI
se a ordem eh pela SAIDAI ASC … anteao o anterior dele seria o primeiro registro do SAIDAI DESC menor que ele …
(SELECT timediff(time(g.HoraSaida),time(gm.HoraSaida)) FROM guiasmov g where g.Idaut < gm.Idaut order by g.HoraSaida DESC limit 0,1)
acho que voce que nao entendeu ainda … melhor tirar do sql que tu tas misturando ja e faz no onRecord pra pegar o registro anteior a ele … melhor.
Diogo,
Desculpa te perturbar, mas como ficaria no onRecord?
Vamos exercitar …
baseado no segundo registro …
"IDIDA""GIDA""DATAI""ViagensI""TURMAI""CARROI""LINHAI""IDA""SAIDAI""CHEGADAI""TEMPOI""PAXI""ID2""INTERVALOIDA"
198495 63413 01/09/2009 1 1 104 13 0 03:58 10:03 06:05 291 198494 -15:32:00
198731 63457 01/09/2009 1 1 128 13 0 04:08 05:08 01:00 12 198730 -17:27:00
198620 63432 01/09/2009 1 1 114 13 0 04:30 05:29 00:59 17 198619 -18:19:00
198581 63425 01/09/2009 1 1 111 13 0 04:32 05:32 01:00 39 198580 -09:12:00
198705 63453 01/09/2009 1 1 126 13 0 05:21 06:16 00:55 48 198704 -16:55:00
198485 63411 01/09/2009 1 1 103 13 0 05:41 06:32 00:51 51 198484 -15:18:00
198733 63457 01/09/2009 2 1 128 13 0 06:01 07:14 01:13 56 198732 00:53:00
198699 63451 01/09/2009 1 1 125 13 0 06:27 09:20 02:53 194 198698 -09:57:00
Quem é o registro anterior ao segundo registro … olhando o codigo, como vc representaria isso via sql?
Vamos exercitar …
baseado no segundo registro …
"IDIDA""GIDA""DATAI""ViagensI""TURMAI""CARROI""LINHAI""IDA""SAIDAI""CHEGADAI""TEMPOI""PAXI""ID2""INTERVALOIDA" 198495 63413 01/09/2009 1 1 104 13 0 03:58 10:03 06:05 291 198494 -15:32:00 198731 63457 01/09/2009 1 1 128 13 0 04:08 05:08 01:00 12 198730 -17:27:00 198620 63432 01/09/2009 1 1 114 13 0 04:30 05:29 00:59 17 198619 -18:19:00 198581 63425 01/09/2009 1 1 111 13 0 04:32 05:32 01:00 39 198580 -09:12:00 198705 63453 01/09/2009 1 1 126 13 0 05:21 06:16 00:55 48 198704 -16:55:00 198485 63411 01/09/2009 1 1 103 13 0 05:41 06:32 00:51 51 198484 -15:18:00 198733 63457 01/09/2009 2 1 128 13 0 06:01 07:14 01:13 56 198732 00:53:00 198699 63451 01/09/2009 1 1 125 13 0 06:27 09:20 02:53 194 198698 -09:57:00
Quem é o registro anterior ao segundo registro … olhando o codigo, como vc representaria isso via sql?
Diogo,
Por estar quebrando a cabeça para resolver isso não consego ver mais nada, Seria algo :
Select timediff(198731,198495) from guiasmov ....
Po, poe o sql ai do jeito que esta na sua aplicação.