É 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
É 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.
Po, poe o sql ai do jeito que esta na sua aplicação.
select a.*, b.* from
(
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.IdGuia FROM guiasmov gm1 where gm1.IdGuia < gm.IdGuia AND gm.Sentido = 0 order by gm1.IdGuia DESC limit 0,1) AS ID2,
(SELECT TIMEDIFF(DATE_FORMAT(gm.HoraSaida,'%H:%i'),DATE_FORMAT(HoraSaida,'%H:%i')) FROM guiasmov where IdGuia = ID2 AND gm.Sentido = 0) 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
)a,
(
SELECT
g.Idaut AS IDVOLTA,
g.IdGuia as GVOLTA,
DATE_FORMAT(g.Data,'%d/%m/%Y') as DATAV,
g.Viagem as ViagensV,
g.Turma as TURMAV,
g.Idcarro as CARROV,
g.IdLinha as LINHAV,
g.Sentido as VOLTA,
DATE_FORMAT(g.HoraSaida,'%H:%i') as SAIDAV,
DATE_FORMAT(g.HoraChegada,'%H:%i') as CHEGADAV,
DATE_FORMAT(g.Tempo,'%H:%i') as TEMPOV,
g.Passageiros as PAXV,
(SELECT gm2.IdGuia FROM guiasmov gm2 where gm2.IdGuia < g.IdGuia AND g.Sentido = 1 order by gm2.IdGuia DESC limit 0,1) AS ID2V,
(SELECT TIMEDIFF(DATE_FORMAT(g.HoraSaida,'%H:%i'),DATE_FORMAT(HoraSaida,'%H:%i')) FROM guiasmov where IdGuia = ID2V AND g.Sentido = 1) AS INTERVALOVOLTA
FROM guiasmov g WHERE
g.Data = '2009-09-01' AND
g.Idcarro Between 100 AND 130 AND
g.Idlinha = 13
AND g.Sentido = 1
)b
WHERE b.ViagensV = a.ViagensI and b.TURMAV = a.TURMAI AND b.GVOLTA = a.GIDA
ORDER BY SAIDAI
Diogo / Harold,
Obrigadão pelo empenho em me ajudar a resolver meus select meio complexo…
Depois de descançar muito voltei a testar o select e consegui resolver o problema. Só ficou meio lento, se vocês tiverem alguma idéia para melhorar o select…
SELECT
gm.Idaut AS IDIDA,
DATE_FORMAT(gm.Data,'%d/%m/%Y') as DATAI,
gm.Idcarro as CARROI,
gm.IdLinha as LINHAI ,
gm.Sentido as IDA,
DATE_FORMAT(gm.HoraSaida,'%H:%i') as SAIDAI,
gm.Passageiros as PAXI,
(SELECT DATE_FORMAT(gm1.HoraSaida,'%H:%i') AS SAI_ANTES FROM guiasmov gm1 where DATE_FORMAT(gm1.HoraSaida,'%H:%i') < DATE_FORMAT(gm.HoraSaida,'%H:%i') AND gm1.Data = '2009-09-01' AND gm1.Idcarro Between 1 AND 200 AND gm1.Idlinha = 13 AND gm1.Sentido = 0 ORDER BY SAI_ANTES DESC LIMIT 0,1) AS SAI1,
TIMEDIFF(DATE_FORMAT(gm.HoraSaida,'%H:%i'),(SELECT DATE_FORMAT(gm1.HoraSaida,'%H:%i') AS SAI_ANTES FROM guiasmov gm1 where DATE_FORMAT(gm1.HoraSaida,'%H:%i') < DATE_FORMAT(gm.HoraSaida,'%H:%i') AND gm1.Data = '2009-09-01' AND gm1.Idcarro Between 1 AND 200 AND gm1.Idlinha = 13 AND gm1.Sentido = 0 ORDER BY SAI_ANTES DESC LIMIT 0,1) ) AS INTERVALOIDA
FROM guiasmov gm
WHERE
gm.Data = '2009-09-01' AND
gm.Idcarro Between 1 AND 200 AND
gm.Idlinha = 13
AND gm.Sentido = 0
ORDER BY
SAIDAI
LIMIT 11
Resultado:
"IDIDA" "DATAI" "CARROI""LINHAI" "IDA" "SAIDAI" "PAXI" "SAI1" "INTERVALOIDA"
199191 01/09/2009 167 13 0 00:27 22 NULL NULL
200206 01/09/2009 87 13 0 00:31 24 00:27 00:04
198276 01/09/2009 82 13 0 00:33 21 00:31 00:02
198867 01/09/2009 145 13 0 01:16 5 00:33 00:43
197521 01/09/2009 5 13 0 02:00 15 01:16 00:44
199193 01/09/2009 167 13 0 02:24 10 02:00 00:24
200208 01/09/2009 87 13 0 02:39 29 02:24 00:15
estas usando indice nos campos que sao mais usados para order by e where?
estas usando indice nos campos que sao mais usados para order by e where?
Sim. Não tem como fazer essa query com Left Join?
So testando … nao sei como comportaria a parte de ordenação, pois eh principio para poder pegar o registro anterior.
Testaria colocar numa view tbm para rodar direto do banco … sei q mysql eh meio lento com view e montando subselectes dinamicos, pois ele tentar criar uma tabela temporaria fisicamente e vai alimentando ela e depois eh q exibe.
Ai tem q ver qual teu banco, configurar para colocar em memoria … ai sao outros 500 … performance.
So testando … nao sei como comportaria a parte de ordenação, pois eh principio para poder pegar o registro anterior.
Testaria colocar numa view tbm para rodar direto do banco … sei q mysql eh meio lento com view e montando subselectes dinamicos, pois ele tentar criar uma tabela temporaria fisicamente e vai alimentando ela e depois eh q exibe.
Ai tem q ver qual teu banco, configurar para colocar em memoria … ai sao outros 500 … performance.
Beleza, tem como me ajudar no meu outro topico…
http://www.netmake.com.br/forum/index.php?topic=2336.0