Ir para conteúdo
Fórum Script Brasil
  • 0

MySQL: WITH


Frank K Hosaka

Pergunta

Eu inventei a rotina da baixa de estoque em 1999, quando trabalhava com MS Access, e adaptei em 2020 no PHP, mas ele é lento demais.

A rotina olha toda a tabela de produtos, estuda cada caso, para ver se é necessário fazer ajuste para calcular o estoque presumido.

Eu queria simplificar, ao invés de olhar tudo, o melhor é olhar o que precisa.

Ou seja, na tabela histórico do produto, eu tenho algo do tipo (666,'2025-02-01',1,10.00), (666,'2025-02-02',1,10.00),(666,'2025-02-03',1,10.00), como eu faço para pegar o último registro? Eu achei a solução lá em 1999, mas ele é péssimo para os padrões de 2025.

O lado bom de viver em 2025 é que tem o Copilot, é um serviço de inteligência artificial que a Microsoft não cobra nada. Por enquanto.

E hoje, o Copilot me apresentou o WITH, eu nem sabia que isso existia no MySQL:

<?php
$pdo=new PDO("mysql:host=localhost;dbname=diario","root","");
$sql="WITH Produtos AS (
    SELECT tbprod.codprod, prod, id, qt, custototal,
        ROW_NUMBER() OVER (PARTITION BY tbprod.codprod ORDER BY id DESC) AS rn
    FROM tbprod
    JOIN tbhistprod ON tbhistprod.codprod = tbprod.codprod
    WHERE loc <> 'a24' AND qt > 0 AND lcto <> 15092 and lcto <> 15093
        AND dia BETWEEN '2025-02-01' AND '2025-02-28')
    SELECT codprod,prod,id, qt, custototal
    FROM Produtos
    WHERE rn = 1";
$produtos=$pdo->query($sql)->fetchAll(PDO::FETCH_OBJ);
echo "<table><th>CodProd<th>Prod<th>Qtotal<th>vTotal<th>Uqt<th>Uvalor<th>AjusteQ<th>AjusteV";
foreach($produtos as $produto) {
    $previa=$pdo->query("select sum(qt) as qt, sum(custototal) as total 
        from tbhistprod where codprod=$produto->codprod")->fetchAll(PDO::FETCH_OBJ)[0];
    if($produto->qt!==$previa->qt) {
        $ajusteQ=$produto->qt - $previa->qt;
        $ajusteV=$produto->custototal - $previa->total;
        echo "<tr><td>$produto->codprod<td>$produto->prod
            <td>$previa->qt<td>$previa->total<td>$produto->qt<td>$produto->custototal
            <td>$ajusteQ<td>$ajusteV";
    }
}
echo "</table>";

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,4k
    • Posts
      652,1k
×
×
  • Criar Novo...