Jump to content
RAFAEL HENRIQUE DE SOUZA

Query recursiva comparando datas

Recommended Posts

Boa noite pessoal. 

Estou com um problema e não consegui sair do lugar, tenho uma tabela de documentos (id, doc, path, ext, id_cli) e outra tabela de controle contendo o Id_documento, tipo_doc, data_criacao.
Preciso informar se o documento listado ja foi substituído.

A regra é a seguinte: Para o documento de mesmo cliente e mesmo tipo ele compara as datas alimentando a coluna de status para o mais recente e substituído par os demais.

Segue o código para ajuda.

create table `tb_documento` (
    `ID_DOCUMENTO` int (11),
    `DOCUMENTO` varchar (60),
    `PATH` varchar (60),
    `EXTENCAO` varchar (15),
    `ID_CLIENTE` int (11)
); 
insert into `tb_documento` (`ID_DOCUMENTO`, `DOCUMENTO`, `PATH`, `EXTENCAO`, `ID_CLIENTE`) values('1','TESTE1','C:\\DOCUMENTOS','PDF','1');
insert into `tb_documento` (`ID_DOCUMENTO`, `DOCUMENTO`, `PATH`, `EXTENCAO`, `ID_CLIENTE`) values('2','TESTE DOC','C:\\DOCUMENTOS','XLS','1');
insert into `tb_documento` (`ID_DOCUMENTO`, `DOCUMENTO`, `PATH`, `EXTENCAO`, `ID_CLIENTE`) values('3','ASLJDBASIHD','C:\\DOCUMENTOS','XLS','1');
insert into `tb_documento` (`ID_DOCUMENTO`, `DOCUMENTO`, `PATH`, `EXTENCAO`, `ID_CLIENTE`) values('4','EXTREME','C:\\DOCUMENTOS','PDF','1');
insert into `tb_documento` (`ID_DOCUMENTO`, `DOCUMENTO`, `PATH`, `EXTENCAO`, `ID_CLIENTE`) values('5','TESTE NOVO','C:\\DOCUMENTOS','DOC','2');
insert into `tb_documento` (`ID_DOCUMENTO`, `DOCUMENTO`, `PATH`, `EXTENCAO`, `ID_CLIENTE`) values('6','WIN','C:\\DOCUMENTOS','DOC','2');
insert into `tb_documento` (`ID_DOCUMENTO`, `DOCUMENTO`, `PATH`, `EXTENCAO`, `ID_CLIENTE`) values('7','XTREME','C:\\DOCUMENTOS','PDF','2');
insert into `tb_documento` (`ID_DOCUMENTO`, `DOCUMENTO`, `PATH`, `EXTENCAO`, `ID_CLIENTE`) values('8','SAMSUNG','C:\\DOCUMENTOS','XLS','2');
insert into `tb_documento` (`ID_DOCUMENTO`, `DOCUMENTO`, `PATH`, `EXTENCAO`, `ID_CLIENTE`) values('9','CPD','C:\\DOCUMENTOS','DOC','3');
insert into `tb_documento` (`ID_DOCUMENTO`, `DOCUMENTO`, `PATH`, `EXTENCAO`, `ID_CLIENTE`) values('10','QQWAS','C:\\DOCUMENTOS','PDF','4');

-------------------------------------------------------------------------------------

create table `tb_tipo_documento` (
    `ID_TIPO` int (11),
    `ID_DOCUMENTO` int (11),
    `DATA_CRIACAO` datetime 
); 
insert into `tb_tipo_documento` (`ID_TIPO`, `ID_DOCUMENTO`, `DATA_CRIACAO`) values('1','1','2019-06-23 18:18:15');
insert into `tb_tipo_documento` (`ID_TIPO`, `ID_DOCUMENTO`, `DATA_CRIACAO`) values('3','2','2019-06-24 18:19:52');
insert into `tb_tipo_documento` (`ID_TIPO`, `ID_DOCUMENTO`, `DATA_CRIACAO`) values('2','3','2019-06-19 18:20:22');
insert into `tb_tipo_documento` (`ID_TIPO`, `ID_DOCUMENTO`, `DATA_CRIACAO`) values('4','9','2019-06-11 18:31:21');
insert into `tb_tipo_documento` (`ID_TIPO`, `ID_DOCUMENTO`, `DATA_CRIACAO`) values('4','10','2019-06-07 18:31:44');
insert into `tb_tipo_documento` (`ID_TIPO`, `ID_DOCUMENTO`, `DATA_CRIACAO`) values('5','5','2019-06-26 18:32:15');
insert into `tb_tipo_documento` (`ID_TIPO`, `ID_DOCUMENTO`, `DATA_CRIACAO`) values('1','4','2019-06-03 18:32:21');
insert into `tb_tipo_documento` (`ID_TIPO`, `ID_DOCUMENTO`, `DATA_CRIACAO`) values('1','6','2019-06-01 18:36:17');
insert into `tb_tipo_documento` (`ID_TIPO`, `ID_DOCUMENTO`, `DATA_CRIACAO`) values('3','7','2019-06-14 18:36:35');
insert into `tb_tipo_documento` (`ID_TIPO`, `ID_DOCUMENTO`, `DATA_CRIACAO`) values('1','8','2019-06-20 18:36:59');
------------------------------------------------------------------------

Modelo de resultado esperado:
SELECT 
    TD.*,
    TTP.ID_TIPO,
    TTP.DATA_CRIACAO,
    '' AS 'STATUS'
FROM 
    TB_DOCUMENTO TD
LEFT JOIN 
    TB_TIPO_DOCUMENTO TTP ON TTP.ID_DOCUMENTO = TD.ID_DOCUMENTO;
----------------------------------------------------------------------
Pessoal muito obrigado, qualquer ajuda é bem vinda!

 

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 Omar~
      É o seguinte, tenho uma tabela de produtos a qual além de possuir características do produto já contém a coluna para o link da mesma.
      Assim sendo faço a consulta da tabela para preencher um menu com o link para cada produto, e é aqui que entra a questão:
       
      Na sua opinião o que seria mais viável ao usuário acessar um produto em questão?
      Reaproveitar o array de retorno da query ao qual usei para compor os links do menu, só que filtrar esse array mostrando o índice ao qual é acessado. Refazer a query listando somente o produto.  
      A aplicação é executada em um único arquivo.
      Onde tenho o menu HTML listando cada produto contido na tabela (A qual também guarda as demais informações do produto).
       
      Reaproveitar a query ficou meio estranho uma vez que tenho um array multi dimencional da query tenho que buscar o índice para ver se ele existe e ainda varrer o array para poder usar os dados do produto tipo assim:
      <?php // $url[1] : É o valor vindo da url // $result : É o array multi de resultado da query if (array_search($url[1], array_column($result, 'ap_link')) !== false) { foreach ($result as $value) { if ($url[1] == $value->ap_link) { // Existe o produto e a url é a mesma do link do produto break; } } } else { // O valor da url não condiz com nenhum produto registrado } Essa alternativa evita uma segunda query desnecessária aliviando o lado do SQL, porém em um arrray multo extenso pode haver lentidão para processar os dados.
      Por outro lado também ficar refazendo consultas também pode deixar a questão meio lenta.
       
      A coisa toda é porque existem centenas de produtos na tabela e em ambos os casos está demorando mais do que deveria.
      Então bateu essa dúvida, qual alternativa tomar, resolvi perguntar, pois várias cabeças peçam melhor que uma.
    • By DarkDucke
      Olá pessoal, preciso fazer uma consulta ma tabela produtos pelo código de barras, mais eu posso ter 100 código de barras para consultar,
      qual a melhor maneira de fazer isso, mais rápida e melhor performance... 
       
      opção 1
      fazer uma consulta em todos de uma vez, tipo
      "select * from produtos where cod_barras = '123' or cod_barras = '456' or cod_barras = '789'" ...  
      opção 2
      fazer 100 consultas, uma para cada código de barras
      for(i=1; i<100; i++) "select * from produtos where cod_barras = array[i]" ...  
      Obrigado!
    • By AlanB.
      Olá, boa tarde! Eu estou com um problema e não consigo resolver. Alguem pode me ajudar?
      Eu tenho uma seção de serviços no site (inseri a imagem como anexo para que voces possam visualizar)
       
      Basicamente são 5 colunas em que cada uma tem uma imagem, um titulo, um quadradinho que abre uma lista e quando clica em algum item da lista, abre um popup com as informações daquele item. 
       
      Para tentar fazer isso com o php eu criei a tabela "servicos" com os campos:
       
      id
      titulo (pra inserir esses titulos abaixo da imagem) - adequação, estruturação, etc.
      lista - os titulos dos itens da lista
      popup - texto com os itens da lista 
       
      Eu adicionei os itens das listas de cada coluna no phpmyadmin e consegui fazer a função de editar e excluir certinho. Mas depois disso, preciso exibir as informações na index.php 
       
      Até agora tentei fazer somente a primeira coluna de "Adequação", vejam o código na index.php para exibir:
       
      <div class="col mb-4 p-3"> <div class="d-flex justify-content-center"> <img src="img/icones/adequacao.png" alt="Adequação"> </div> <p class="mt-3 titulobranco text-center">Adequação</p> <div class="servicos d-flex justify-content-center"> <ul class="nav"> <li class="nav-item dropdown"> <img class="quadrado nav-link" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" src="img/icones/quadrado.png" alt="Conscientização"> <div class="dropdown-menu dropdown-menu-personalizado" aria-labelledby="navbarDropdown"> <?php $titulo = "Adequação"; $sql = "SELECT * FROM servicos WHERE titulo = '$titulo'"; $sql = $pdo->query($sql); if($sql->rowCount()>0){ foreach($sql->fetchAll() as $servicos){ echo'<a class="dropdown-item textoservicos">'.$servicos['lista'].'<div style="float:right; color:#27B1F7;">&#43;</div></a>'; } } ?> </div> </li> </ul>' </div> </div> Eu não sei se esse código está certo, mas está funcionando. Ele está exibindo na primeira coluna "Adequação", os itens da lista desse respectivo titulo.
       
      Mas o popup não está funcionando, ao clicar em um item da lista deveria abrir o popup com o respectivo texto cadastrado naquele item, mas não está funcionando.
       
      Esse foi o código do popup que eu fiz:
       
      <? $titulo = "Adequação"; $sql = "SELECT * FROM servicos WHERE titulo = '$titulo' "; $sql = $pdo->query($sql); if($sql->rowCount()>0){ foreach($sql->fetchAll() as $servicos){ echo '<div id="modal-servicos" class="modal-container">'; echo '<div class="modaldentro">'; echo '<button class="fecharmodal">X</button>'; echo '<h3>'.$servicos['lista'].'</h3>'; echo '<p>'.$servicos['popup'].'</p>'; echo '</div>'; echo '</div>'; } } ?> Alguem pode me ajudar a corrigir o meu código e fazer funcionar?
       
      Obrigado

    • By Webster Moitinho
      Estou tentando fazer o controle de acesso do meu site. Para tanto criei duas tabelas:
      Stat (Armazena cada sessao dos usuários
      Estrutura da tabela `stat`
      CREATE TABLE `stat` ( `id_stat` int(11) NOT NULL, `navegador` varchar(85) NOT NULL, `usuario` int(11) NOT NULL, `cep` varchar(7) NOT NULL, `ip_visitante` varchar(15) NOT NULL, `sessao` varchar(72) NOT NULL, `pais` varchar(30) NOT NULL, `estado` varchar(30) NOT NULL, `cidade` varchar(50) NOT NULL, `latitude` decimal(11,5) NOT NULL, `longitude` decimal(11,5) NOT NULL, `ip_meuservidor` varchar(72) NOT NULL, `hora_req` time NOT NULL, `origem` varchar(175) NOT NULL, `idioma` varchar(50) NOT NULL, `SERVER_ADMIN` varchar(90) NOT NULL, `servidor` varchar(90) NOT NULL, `visitada` longtext CHARACTER SET utf8 NOT NULL, `registro` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- Indexes for table `stat` ALTER TABLE `stat` ADD PRIMARY KEY (`id_stat`); -- AUTO_INCREMENT for table `stat` ALTER TABLE `stat` MODIFY `id_stat` int(11) NOT NULL AUTO_INCREMENT; sub_stat (Para armazenar as páginas visitadas e as interações com o cliente:
      CREATE TABLE `sub_stat` ( `id_substat` int(11) NOT NULL, `sessao` varchar(72) NOT NULL, `hora_req` time NOT NULL, `origem` varchar(85) NOT NULL, `visitada` varchar(85) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- Indexes for table `sub_stat` ALTER TABLE `sub_stat` ADD PRIMARY KEY (`id_substat`); -- AUTO_INCREMENT for table `sub_stat` ALTER TABLE `sub_stat` MODIFY `id_substat` int(11) NOT NULL AUTO_INCREMENT; O desejado portanto, seria que quando o usuário entrasse na página, o script localizasse a sessão do usuário, buscaria a sessão na tabela stat, caso não existisse, iria inserir o registro tanto na tabela stat, quanto na tabela sub_stat. Se existisse a sessão na tabela stat, então somente haveria inserção dos registros na tabela sub_stat. Eu não estou conseguindo executar a segunda consulta, que vai popular a tabela sub_stat.
       
      Meu código está assim:
       
      $sql = "SELECT sessao FROM stat WHERE sessao = '$sessao'"; $prepara = $PDO->prepare( $sql ); $prepara->execute(); $login_check = $prepara->rowCount(); if($login_check < 1){ $sql = "INSERT INTO `stat` (`id_stat`, `navegador`, `usuario`, `cep`, `ip_visitante`, `sessao`, `pais`, `estado`, `cidade`, `latitude`, `longitude`, `ip_meuservidor`, `hora_req`, `origem`, `idioma`, `servidor`, `visitada`, `registro`) VALUES (NULL, '$navegador', '$usuario', '$cep', '$meuip', '$sessao', '$pais', '$estado', '$cidade', '$lat', '$long', '$ip', '$hora_req', '$origem', '$idioma', '$servidor', '$visitada', '$registro')"; $compile = $PDO->prepare($sql); $vai = $compile->execute(); $sql2 = "INSERT INTO `sub_stat` (`id_substat`, `sessao`, `hora_req`, `origem`, `visitada`) VALUES (NULL, '$sessao', '$hora_req', '$origem', '$visitada'"; $compile2 = $PDO->prepare($sql2); $vai = $compile2->execute(); } else { $sql = "INSERT INTO `sub_stat` (`id_substat`, `sessao`, `hora_req`, `origem`, `visitada`) VALUES (NULL, '$sessao', '$hora_req', '$origem', '$visitada'"; $compile = $PDO->prepare($sql); $vai = $compile->execute(); }  
    • By GuiPetenuci
      Boa tarde,
      Estou com um problema e estou ficando louco, ja li praticamente todos as respostas de View de SQL Server no Stack Overflow e a maioria da documentacao da MSFT
       
      Tenho uma view que faz algumas queries malucas que o cliente precisa, mas ela nao retorna o resultado justo, e se eu pegar o codigo e fazer uma query simples com o codigo, o resultado è ok.
       
      Codigo da View
      SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /****** Object:  View [QEHS].[V_FactMonitorings25261gui]    Script Date: 11/07/2019 16:24:53 ******/ CREATE view      [QEHS].[V_FactMonitorings25261gui] as      with     Plants as      (         select distinct              [plant-id]          from              [QEHS].[Fact-Monitorings-H&S]                 ) ,      MIDs as      (         select mid          from          (             values                 ( 'MON.02.25 Total number of LTA free days (calendar days)')                 ,( 'MON.02.26 Total number of TRI free days (calendar days)')          ) as x(mid)      ),      PlantList      AS     (         select              a.date,              b.[plant-id],              c.mid         from              QEHS.Calendar_Gen A              cross join              plants b                 cross join mids c         where              year(a.date) >= 2011     ),      help1 as      (         SELECT              p.date,              p.[plant-id],             p.mid,              t.value,             (             case                  when (year(p.date) = year(getdate()) and month(p.date) = month(getdate())) then                      day(getdate())                  else                      iif(t.value is not null, 0, day(eomonth(p.date)))                             end                           ) Days,              cast(isnull(cast(t.value as bit),0) as integer) reset          FROM              PLANTLIST p              left join              [QEHS].[Fact-Monitorings-H&S] T             on             (                  p.date = t.date and                   p.[plant-id] = t.[plant-id] and                   p.mid = t.[monitoring-id]              )                  ),      help2 as      (         select              date,              [plant-id],              mid,              value,              days,              reset,             formatmessage('%s%s%d', [plant-id], mid,sum(reset) over                  (                      partition by  [plant-id], mid                      order by  date, [plant-id], mid                 )             ) grp         from             help1          where              year(date) >= (select year(min(date)) from [QEHS].[Fact-Monitorings-H&S])             ),     help3 as      (         select              date,              [plant-id],              mid,              value,              days,              first_value(value) over (partition by grp order by date, [plant-id], mid) fullvalue         from              help2      )      --      select          date,          [plant-id],          mid,          isnull(a.Value,              fullvalue +sum(days) over              (                  partition by [plant-id], mid, fullvalue                   order by  mid, date, [plant-id]                  rows between unbounded preceding and current row             )          ) total     from          help3 a          GO a view retorna assim:

       
      Agora se eu pegar e fazer a query "na mao", retorna assim, que è o justo:

       
      Agora, porque na view retorna um e a query retorna outro? o.o
×

Important Information

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