Juntar querys

6 respostas
S

Ae galera estou postando aqui no guj, apesar do assunto não ser java, pq o pessoal sempre foi muito conciso e prestativo.

Tenho um sistema em php, controle de acesso de onibus, estou no começo ainda, que deverá exibir um relatorio com as totalizações usuarios em um determinado dia. Estes dados serão agrupados por linha, carro e cobrador. Necessito selecionar os totais de Vale tranporte, gratuito, estudante e etc.

A principio criei esta query:

select r.linha, r.carro, (select rv.pass from reg rv join tipo t on t.tipo = r.tipo where rv.dataf = '2010.09.17' and t.class = 'VT' and rv.linha = r.linha) as VT, (select rg.pass from reg rg join tipo t on t.tipo = r.tipo where rg.dataf = '2010.09.17' and t.class = 'GRA' and rg.linha = r.linha) as GRA, (select re.pass from reg re join tipo t on t.tipo = r.tipo where re.dataf = '2010.09.17' and t.class = 'EST' and re.linha = r.linha) as EST, (select rc.pass from reg rc join tipo t on t.tipo = r.tipo where rc.dataf = '2010.09.17' and t.class = 'COM' and rc.linha = r.linha) as COM, (select rs.pass from reg rs join tipo t on t.tipo = r.tipo where rs.dataf = '2010.09.17' and t.class = 'SUB' and rs.linha = r.linha) as SUB, (select rp.pass from reg rp join tipo t on t.tipo = r.tipo where rp.dataf = '2010.09.17' and t.class = 'PRE' and rp.linha = r.linha) as PRE, (select rl.lib from reg rl join tipo t on t.tipo = r.tipo where rl.dataf = '2010.09.17' and t.class = 'LIB' and rl.linha = r.linha) as LIB, (select ri.pass from reg ri where ri.dataf = '2010.09.17' and ri.pass=1 and ri.sts=2 and ri.linha = r.linha) as ITG from reg r where r.dataf = '2010.09.17' group by r.linha, r.carro order by r.linha, r.carro
Ela faz exatamente o que eu preciso, porem, demora uns 5min. para ser executada.

Uma outra opção, que em função do tempo é viavel, seria fazer estas pesquisas separadamente, depois junta-las e exibir o relatorio. É exatamente nesse ponto que mora meu problema, na hora de juntar essas querys, eu tenho que agrupa-las por linha e carro em cada tipo (estudante, gratuito, etc), ou seja, criar um novo array que será a união de todos os outros. Um outro detalhe, é que nem todas as linhas, possuem movimento de todos os tipos de cartão, então algumas querys retornam linhas que as outras não.
Não tenho a menor ideia de como fazer.
Alguem poderia dar uma luz?
Muito obrigado.

6 Respostas

A

duas dúvidas:

que banco de dados está utilizando?

quantas linhas tem a tabela reg ?

ah… outras coisa: algum indice na tabela?

S

Banco é um mysql, a reg no momento tem uns 22000 registros, mas, ela vai chegar até uns 3.000.000 de registros.
Os indices são, equipamento, data e hora e um número de sequencia, que uso para outras consultas.
Obrigado.

A

cara, eu sinto muito mas não poderei te ajudar…

fiz um teste aqui na minha máquina usando oracle (não tenho mysql instalado).

mesmo com 80k registros, sua query praticamente exata* rodou em menos de um segundo…

não tenho experiência em mysql, para dar dicas específicas…

sugiro apenas procurar uma ferramenta que exiba o plano de execução e te mostre onde está o gargalo…

  • fiz algumas correções pois ela não roda do jeito que está…na sua máquina roda exatamente assim?
S

AbelBueno:
cara, eu sinto muito mas não poderei te ajudar…

fiz um teste aqui na minha máquina usando oracle (não tenho mysql instalado).

mesmo com 80k registros, sua query praticamente exata* rodou em menos de um segundo…

não tenho experiência em mysql, para dar dicas específicas…

sugiro apenas procurar uma ferramenta que exiba o plano de execução e te mostre onde está o gargalo…

  • fiz algumas correções pois ela não roda do jeito que está…na sua máquina roda exatamente assim?


Sim, rodo exatamente essa query, sem nenhuma alteração e demora mais de 5 min.
Vou ver onde está o gargalo, mas, acho que a solução vai ser fazer consultas separadas e adaptar na aplicação msm. Mas, essa saida ainda esta bem enrolada.
Mesmo assim, muito obrigado pela ajuda.

A

quando eu rodei essa query exatamente como está, o oracle me informou que estava incorreta.

repare nos sub-selects:

select rv.pass from reg rv join tipo t on t.tipo = r.tipo where rv.dataf = '2010.09.17' and

onde está t.tipo = r.tipo não deveria ser t.tipo = rv.tipo ?

em todas as subqueries você está fazendo referência a r que é o alias da tabela externa…
talvez o mysql permita isso e não seja exatamente o que quer…

S

AbelBueno:
quando eu rodei essa query exatamente como está, o oracle me informou que estava incorreta.

repare nos sub-selects:

select rv.pass from reg rv join tipo t on t.tipo = r.tipo where rv.dataf = '2010.09.17' and

onde está t.tipo = r.tipo não deveria ser t.tipo = rv.tipo ?

em todas as subqueries você está fazendo referência a r que é o alias da tabela externa…
talvez o mysql permita isso e não seja exatamente o que quer…


Certissimo cara, realmente vacilei ai, mas, infelizmente não era a solução do problema =(

Criado 23 de setembro de 2010
Ultima resposta 24 de set. de 2010
Respostas 6
Participantes 2