Jump to content
Ygor Guedes

Consulta em 3 tabelas

Recommended Posts

Senhores, bom dia! Gostaria de uma imensa ajuda pois neste momento estou com uma consulta que está levando muito tempo para ser concluída; via mysql.

Gostaria de me fazer entender:

1. Na tabela status, recebo a cada 3 minutos, aproximadamente 500 registros.

2. Na tabela cadastro_ponto, estão os dados estáticos para pesquisa, que deveria estar entrelaçado com a tabela status.

3. Na tabela tab_garagens, também possui dados estáticos.

4. O campo em comum na tabela status e na tabela cadastro_pontos, é o campo onibus_ponto

5. O campo em comum na tabela cadastro_pontos e na tabela tab_garagens, é o campo local com o campo onibus_prefixo

 

Minha consulta seria a seguinte: buscar apenas o último registro de cada agrupamento de dados (agrupado pelo campo onibus_ponto com MAX(data) em que estes fiquem diferentes de 4 minutos) com um join na tabela cadastro_pontos (para verificar se existe uma associação) e um último join  na tabela tab_garagens (para verificar se existe um cadastro associado também).

 

Hoje minha consulta está assim:

SELECT s.id, s.onibus_ponto, s.data FROM status s JOIN cadastro_pontos c ON c.onibus_ponto = s.onibus_ponto JOIN tab_garagens t ON t.onibus_prefixo = c.local WHERE s.id = (SELECT id FROM status WHERE onibus_ponto = s.onibus_ponto ORDER BY data DESC LIMIT 1) AND data < (NOW() - INTERVAL 4 MINUTE)

 

No entanto, ela está demorando muito tempo para realizar toda esta consulta (de 3 a 5 minutos). Alguma coisa não está certo e eu não entendo muito de SQL; tenho apenas conhecimentos superficiais.

 

Outro detalhe: como inserir alguma coisa e fazer com que os dados se apaguem automaticamente, deixando sempre os mais novos, AGRUPADOS pela coluna onibus_ponto? Esta tabela, a cada dia, gera aproximadamente 13 mil registros.

 

Se puderem me ajudar, fico agradecido!

 

Minhas tabelas estão em anexo!

mysql.png

Share this post


Link to post
Share on other sites
SELECT s.id, s.onibus_ponto, s.data FROM status s 
INNER JOIN cadastro_pontos c ON c.onibus_ponto = s.onibus_ponto 
INNER JOIN tab_garagens t ON t.onibus_prefixo = c.local 
WHERE s.id = (SELECT id FROM status WHERE onibus_ponto = s.onibus_ponto ORDER BY data DESC LIMIT 1) AND data < (NOW() - INTERVAL 4 MINUTE)

Teste usando INNER JOIN..

Share this post


Link to post
Share on other sites
1 hora atrás, ckcesar disse:

SELECT s.id, s.onibus_ponto, s.data FROM status s 
INNER JOIN cadastro_pontos c ON c.onibus_ponto = s.onibus_ponto 
INNER JOIN tab_garagens t ON t.onibus_prefixo = c.local 
WHERE s.id = (SELECT id FROM status WHERE onibus_ponto = s.onibus_ponto ORDER BY data DESC LIMIT 1) AND data < (NOW() - INTERVAL 4 MINUTE)

Teste usando INNER JOIN..

Testei sua modificação meu caro; demorou muito na consulta também. :/

Share this post


Link to post
Share on other sites

As tabelas tem índices ?

Um indice por data pode melhorar a coisa.

 

 

Se poderia gerar uma tabela histórico e uma diária , um event copiaria os dados da diaria para a historico e daria um truncate na diaria.

 

 

Tente tb esta sql

 

SELECT s.id, s.onibus_ponto, s.data
FROM status s
INNER JOIN cadastro_pontos c ON c.onibus_ponto = s.onibus_ponto
INNER JOIN tab_garagens t ON t.onibus_prefixo = c. local
WHERE s.data = (SELECT max(s2.data)
                FROM status s2
                WHERE s2.onibus_ponto = s.onibus_ponto
                and s2.data < (NOW() - INTERVAL 4 MINUTE))
AND data < (NOW() - INTERVAL 4 MINUTE)

 

Share this post


Link to post
Share on other sites
Em 06/11/2019 at 21:13, Motta disse:

SELECT s.id, s.onibus_ponto, s.data FROM status s INNER JOIN cadastro_pontos c ON c.onibus_ponto = s.onibus_ponto INNER JOIN tab_garagens t ON t.onibus_prefixo = c. local WHERE s.data = (SELECT max(s2.data) FROM status s2 WHERE s2.onibus_ponto = s.onibus_ponto and s2.data < (NOW() - INTERVAL 4 MINUTE)) AND data < (NOW() - INTERVAL 4 MINUTE)

 

Motta, boa tarde! Sua consulta demorou também. Eu deixei minha consulta desse jeito (menor tempo que encontrei):

SELECT m.onibus_ponto, data FROM status AS m INNER JOIN (SELECT onibus_ponto, MAX(data) AS data FROM status GROUP BY onibus_ponto) x USING(onibus_ponto, data) INNER JOIN cadastro_pontos AS c ON c.onibus_ponto = m.onibus_ponto WHERE data < (NOW() - INTERVAL 4 MINUTE) GROUP BY m.onibus_ponto

No entanto, realmente, minha tabela está ficando imensa pelo fato de ter muitos registros em pouco tempo; já está na casa de 1 milhao de registros. Pensei bem e gostaria de excluir os antigos, por grupos (onibus_ponto). Queria excluir os dados mais antigos de cada grupo deixando uns 2 registros, os mais novos, apenas.

Da imagem que segue, gostaria de deixar da coluna onibus_ponto apenas os 2 registros mais novos:

 

(12/09/19 10 AM e 12/09/19 09 AM) - onibus_ponto 10

(12/09/19 09 AM e 12/09/19 07 AM) - onibus_ponto 5

(12/09/19 10 AM e 12/09/19 05 AM) - onibus ponto 4

 

O restante, eu gostaria de excluir tudo. Assim evita de ficar uma tabela com muitos dados.

 

imagem.png

Share this post


Link to post
Share on other sites
14 horas atrás, Motta disse:

Pensou em particionar ?

 

https://dev.mysql.com/doc/refman/5.7/en/partitioning.html

 

 

Pense bem antes de descartar dados , informação é dinheiro. $$$

 

Volume de passageiros por hora e ponto , publicidade .... etc ...

 

Bom dia Motta! Já pensei sim, porém, esta tabela é apenas uma informação sem importância; ela apenas pega o status do computador pra saber quando foi a última vez que ele comunicou com meu servidor. Por isso que a tabela está gigante. Eu não criei um robot pra isso, eu faço via SQL mesmo + ShellScript.

Share this post


Link to post
Share on other sites

Beleza , como diria o Cap. Nascimento "senta o delete nesta |◇044@"

 :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Negrito
      Olá Pessoal, 
       
      Converti o banco de dados de uma app em ASP Classico de MSSQL para MySQL para redução de custos e percebi que alguns componentes ou recursos não estão mais funcionando devido a não compatibilidade com o MySQL , como por exemplo a função : RecordCount
       
      Já consegui converter e atualizar 95% de aplicação para rodar com o MySQL, mas tem 1 item que esta tirando meu sono e após dias pesquisando, resolvi pedir ajuda.
       
      Segue o meu codigo abaixo , onde estou com problema no resultado dessa operação:
       
      <%
      ...
      Set RS = Server.CreateObject("ADODB.Recordset")
      RS.CursorLocation = 3
      RS.CursorType = 3
      RS.ActiveConnection = Cn
      RS.Open strSQL, Cn, 3, 3
      RS.PageSize = 25
      RS.CacheSize = RS.PageSize
      intPageCount = RS.PageCount
      intRecordCount = RS.RecordCount
          If NOT (RS.BOF AND RS.EOF) Then
      If CInt(intPage) > CInt(intPageCount) Then intPage = intPageCount
          If CInt(intPage) <= 0 Then intPage = 1
              If intRecordCount > 0 Then
                  RS.AbsolutePage = intPage
                  intStart = RS.AbsolutePosition
                  If CInt(intPage) = CInt(intPageCount) Then
                      intFinish = intRecordCount
                  Else
                      intFinish = intStart + (RS.PageSize - 1)
                  End if
              End If
          If intRecordCount > 0 Then
              For intRecord = 1 to RS.PageSize
          QntExibicoes = QntExibicoes + Rs.fields("views")
      ...
      %>
       
       
      Já percebi que a função RecordCount não pode ser usada com o MySQL ou pelo menos não é compativel.
       
      A paginação esta funcionando ! 
      Porem , não consigo fazer ele calcular a quantidade de linhas (rows) do MySQL com a função RecordCount e acredito que possa ter alguma outra função que não esta compativel , mas como não conheço MySQL , não posso afirmar.
       
      Enfim, algum pode me dar uma luz ?
       
      Desde já agradeço pela atenção.
       
      Obrigado.
    • By jgasper
      Olá, estou desenvolvendo um sistema de requisições para almoxarifado. Na tela de requisição o usuário terá a opção de incluir o item + quantidade que deseja, e haverá um botão + para poder adicionar mais itens. Porém não consigo pensar em como fazer isso ir para o banco e como salvar isso no pedido. Alguém tem algum exemplo ou pode me ajudar nesse caso?
    • By Sapinn
      Opa galera tudo beleza? Então meu banco está me retomando um erro quando tento inserir nele que é "Dados truncados na coluna valor_produto" essa coluna era do tipo Double quando eu mudei para ela para TEXT funcionou os dados foram inseridos mas eu preciso que ela seja do tipo double. Alguém sabe como resolver????
    • By patrickjnunes1995
      Bom dia, estou tendo dificuldades em recuperar dados de uma tabela do banco de dados, pelo PHP.
      <?php require_once('conexao_bd.php'); $consulta = "SELECT * FROM table"; $con = $mysqli->query($consulta) or die ($mysql->error); echo $dado["nome"]; ?>  
      E o arquivo conexão_bd.php está ok.
       
      Não pude encontrar em nenhuma página pela internet essa solução.
       
      Quero que exiba na página PHP, valores como algum nome, gravado na tabela do banco de dados.
       
      Desde já obrigado.
    • By srs1999_
      Tópico
       
      Site em Código
      Sobre desenvolver sites sem o wordpress que ja tá tudo ali feito que seja um site dinâmico ou seja com banco de dados , APIs de pagamento, Painel para o usuário ,  além de todas  as funções que tem no wordpress e você teria propriedade pra explicar sobre detalhes mais técnicos da produção onde no wordpress só quem entende de progrqmação explicaria algum detalhe técnico 
      Então usando basicamente : 
      FRONT END 
      HTML 
       CSS 
      JAVASCRIPT 
      ALGUMA DE BACKEND COMO PHP E BANCO DE DADOS
      Pode se criar sites/sistemas tão bons ou melhores que no wordpress
       
      Fato : o proprio wordpress é feito em php e ate o proprio facebook tbm em php
      Fato 2 :  cerca de 70% dos sites são feitos em Wordpress
       
      Acho esse lance de procurar o caminho mais fácil limita muito a pessoa por exemplo é facil editar imagens no paint bem intuitivo , agora para editar no photoshop com muitas outras possibilidades  acaba sendo importante ir explorando essa elaboração mais difícil  com um mesmo objetivo. No caso do exemplo ( editar imagens )  
       
      Reflexão:
      Vale a pena se dedicar a trabalhar com a ferramenta Wordpress apenas por ser um meio rápido de ganhar dinheiro ?
      Ou trabalhar sem wordpress  usando tudo que exigido pra criar coisas originais mais que não seria tão rápido a produção. Mas creio que além dos sites feitos também geraria a possibildade de vender o sistema web criado para o cliente personalizar .
       
      Você Desenvolveria de que forma :
       Wordpress apenas ?
       
      Conhecer programação pra trabalhar 
      com  Wordpress ?
       
      Produzir tudo só com programação totalmente dinâmico sem  Wordpress?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.