Ir para conteúdo
rcamu

Select duplicando as linhas

Recommended Posts

Tenho o select abaixo, só que ele está trazendo duas linhas para o mesmo produto, ele traz uma linha para o d.tipo      = '0' e outra para o  d.tipo      = '1', preciso que na mesma linha mostre os 2.

 

Onde estou errando?

 

SELECT STRAIGHT_JOIN      DISTINCT TMP.*
FROM        (
                SELECT      DISTINCT d.cat_id   AS prod
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(d.qtd)          AS qtd_prod
                        ,   SUM(d.valor_total)  AS total_prod
                        ,   SUM(0)              AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '0'
                        AND c.dtConcat  BETWEEN '2018-05-01' AND '2018-08-05'
                        AND c.exportado = 'Sim'
                GROUP BY    prod
                UNION all
                SELECT STRAIGHT_JOIN     DISTINCT d.cat_id   AS prod
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(0)              AS qtd_prod
                        ,   SUM(0)              AS total_prod
                        ,   SUM(d.qtd)          AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '1'
                        AND c.dtConcat  < '2018-08-05'
                        AND c.exportado = 'Sim'
                GROUP BY    prod
            ) TMP
ORDER BY    TMP.qtd_prod DESC

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

da erro, poderia me dizer como usar por favor?

 

Fiz assim e da erro:

 

SELECT  DISTINCT TMP.*
FROM        (
                GROUP_CONCAT( SELECT DISTINCT d.cat_id   AS prod)
                ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(d.qtd)          AS qtd_prod
                        ,   SUM(d.valor_total)  AS total_prod
                        ,   SUM(0)              AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '0'
                        AND c.dtConcat  BETWEEN '2018-05-01' AND '2018-08-05'
                        AND c.exportado = 'Sim'
                group by prod, id_prod
                UNION
               GROUP_CONCAT( SELECT DISTINCT d.cat_id   AS prod)
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(0)              AS qtd_prod
                        ,   SUM(0)              AS total_prod
                        ,   SUM(d.qtd)          AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '1'
                        AND c.dtConcat  < '2018-08-05'
                        AND c.exportado = 'Sim'
                group by prod, id_prod
            ) TMP 
ORDER BY    TMP.qtd_prod DESC

e desse outro modo ele continua com os resultados duplicados.

 

SELECT  DISTINCT TMP.*
FROM        (
                SELECT GROUP_CONCAT( DISTINCT d.cat_id)
                ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(d.qtd)          AS qtd_prod
                        ,   SUM(d.valor_total)  AS total_prod
                        ,   SUM(0)              AS qtd_estoque
     
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '0'
                        AND c.dtConcat  BETWEEN '2018-05-01' AND '2018-08-05'
                        AND c.exportado = 'Sim'
                group by d.cat_id
                UNION
               SELECT GROUP_CONCAT( DISTINCT d.cat_id)
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   SUM(0)              AS qtd_prod
                        ,   SUM(0)              AS total_prod
                        ,   SUM(d.qtd)          AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '1'
                        AND c.dtConcat  < '2018-08-05'
                        AND c.exportado = 'Sim'
                group by d.cat_id
            ) TMP 
ORDER BY    TMP.qtd_prod DESC

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio ser isto 

 

SELECT STRAIGHT_JOIN   prod,id_prod,ID,qtd_prod,total_prod,qtd_estoque,
                       GROUP_CONCAT(DISTINCT TIPO
                      ORDER BY TIPO DESC SEPARATOR ' ') TIPOS
FROM        (
                SELECT      DISTINCT d.cat_id   AS prod
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   d.tipo              AS TIPO
                        ,   SUM(d.qtd)          AS qtd_prod
                        ,   SUM(d.valor_total)  AS total_prod
                        ,   SUM(0)              AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '0'
                        AND c.dtConcat  BETWEEN '2018-05-01' AND '2018-08-05'
                        AND c.exportado = 'Sim'
                GROUP BY    prod
                UNION all
                SELECT STRAIGHT_JOIN     DISTINCT d.cat_id   AS prod
                        ,   p.id
                        ,   p.nome              AS id_prod
                        ,   d.tipo              AS TIPO
                        ,   SUM(0)              AS qtd_prod
                        ,   SUM(0)              AS total_prod
                        ,   SUM(d.qtd)          AS qtd_estoque
                FROM        lc_controle c
                INNER JOIN  lc_detalhe  d ON d.controle_id  = c.id
                INNER JOIN  lc_cat      p ON p.id           = d.cat_id
                WHERE       d.tipo      = '1'
                        AND c.dtConcat  < '2018-08-05'
                        AND c.exportado = 'Sim'
                GROUP BY    prod
            ) TMP
ORDER BY    TMP.qtd_prod DESC

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo , sem a base fica difícil.

 

Mas a síntaxe do group e colocá-lo numa linha

 

Como as " quantidades incorretas" eradas vieram ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele retornou apenas 1 produto e a qtd veio apenas do tipo 0, como poderia te passar as bases?

 

prod id_prod ID qtd_prod total_prod qtd_estoque TIPOS  
24 HJ-111B FILTRO INTERNO 200LH 127V   24 87 1709.40 0 1 0
 
 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema são os totalizadores , else ficam incompatíveis 9em tese) com o agrupamento em linha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por _marlon307
      Tenho uma tabela em meu banco de dados em que as colunas usuário e e-mail são do tipo unio. Como faço para verificar as duas colunas ao mesmo tempo e retorna um valor se encontrar um registro iguai.
    • Por leonardo021970
      Tem alguma maneira de capturar todas as urls do site?
      Testei pelo google mas ele retorna apenas alguns resultados pelo jeito que testei
    • Por _marlon307
      Estou fazendo um sistema simples de cadastro de usuário e preciso que o usuário e e-mail sejam únicos. Mas já configurei a minha tabela para que esses campos seja único. O problema e fazer a checagem para que não retorne erros, e sim redirecionar para pagina de cadastro.
       
      Código:
      <?php require_once 'config/connect.php'; $usermail = mysqli_real_escape_string($link, $_POST['email']); $username = mysqli_real_escape_string($link, $_POST['usuario']); $userpsw = mysqli_real_escape_string($link, $_POST['senha']); $sql = "SELECT usuario, email FROM `tb_usuarios` WHERE `usuario` = '$username', `email` = '$usermail'"; mysqli_query($link, $sql) or die(mysqli_error($link)); $linhas = mysqli_affected_rows($link); if($linhas > 0) { header("Location:cadastro"); } else { $sql = "INSERT INTO tb_usuarios (usuario, senha, email) VALUES ('$username','$userpsw','$usermail')"; mysqli_query($link,$sql) or die(mysqli_error($link)); $linhas = mysqli_affected_rows($link); if($linhas > 0) { header("Location:login"); } } ?>  
    • Por stefanys
      Estou desenvolvendo um trabalho voluntario para uma instituição, o site está praticamente pronto para funcionamento, no entanto uma pagina começou a dar erro
       
      SOLICITACAO.PHP
       
      <?php
      include "verifica.php";
              include "conexao.php";

              $usuario = $_SESSION['usuario_usuario'];
              $sql = mysqli_query($db,"SELECT * FROM login where email = '$usuario'");
              while($linha = mysqli_fetch_array($sql)){
                  $_SESSION['id_usuario']= $linha['id_login'];
                  $id_login = $linha['id_login'];
                  $nome = $linha['nome'];
                  $email = $linha['email'];
                  $telefone = $linha['telefone'];
                  $senha = $linha['senha'];
                  $foto = $linha['fotoperfil'];
              }
       if (isset($_POST['cadastrar'])) {
      $idade = $_POST['idade'];
      $endereco = $_POST['endereco'];
      $telefone = $_POST['telefone'];
      $motivo = $_POST['motivo'];
      $castracao = $_POST['castracao'];
      $seguranca = $_POST['seguranca'];
      $cuidados = $_POST['cuidados'];
      $espaco = $_POST['espaco'];
      $doacao = $_POST['doacao'];
      $vida_animal = $_POST['vida_animal'];
      $adaptacao = $_POST['adaptacao'];
      $ciencia = $_POST['ciencia'];
      $mudanca = $_POST['mudanca'];
      $horario = $_POST['horario'];
      $visitas = $_POST['visitas'];
      $acesso = $_POST['acesso'];
      $outro_animal = $_POST['outro_animal'];
      $confirmar = $_POST['confirmar'];
      $id_login = $linha['id_login'];
      $idanimal = $_POST['idanimal'];
             
                 $query =  mysqli_query($db, "INSERT INTO solicitacao (  endereco, telefone, motivo, castracao, seguranca, cuidados, espaco, doacao, vida_animal, adaptacao, ciencia, mudanca, horario, visitas, acesso, outro_animal, confirmar, id_login, idanimal, idade)  VALUES  ('".$endereco."', '".$telefone."','".$motivo."', '".$castracao."', '".$seguranca."', '".$cuidados."', '".$espaco."', '".$doacao."', '".$vida_animal."', '".$adaptacao."', '".$ciencia."',  '".$mudanca."','".$horario."', '".$visitas."', '".$acesso."', '".$outro_animal."', '".$confirmar."',  '".$id_login."', '".$idanimal."','".$idade."')");
                 
                 if($query){
                  echo "<script language='javascript' type='text/javascript'>alert('SUCESSO');window.location.href='perfilusuario.php';</script>";
                 }else{
                   echo"<script language='javascript' type='text/javascript'>alert('Desculpe! Tente novamente!');window.location.href='perfilusuario.php';</script>";
                 }
                 
       }
             
      ?>
       
      ELE ESTÁ APENAS INDO PARA A MENSAGEM DE ERRO, PRECISO DE AJUDA
    • Por eduardom
      Olá.
       
      Tentarei exemplificar o problema.
       
      Tenho uma tabela com duas colunas e seus respectivos conteúdos:
      VALOR (int), DATA (datetime)
      1, 2018-12-10 20:50:00
      5, 2018-12-13 12:00:00
      4, 2018-12-13 13:00:00
      3, 2018-12-13 17:00:00
      2, 2018-12-15 06:00:00
      9, 2018-12-15 08:00:00
       
      Consulto as informações, por exemplo:
       
      SELECT * FROM TABELA WHERE DATA BETWEEN '2018-12-13 00:00:00' AND '2018-12-13 23:59:59'
       
      Está me trazendo somente os valores 4 e 5, o 3 ele não trás, porém todos estão dentro do período.
      Com isso, estou perdendo registros nas consultas.
      Buscando somente o valor 3 direto, (SELECT * FROM TABELA WHERE VALOR = 3), ele trás a informação normalmente.
      Adicionei e removi os índices, tentei otimizar a tabela, porém nada resolve.
      Não sei se envolve o tamanho da tabela, pois há 2.782.219 registros na mesma.
       
      Estrutura da tabela: InnoDB
      Formatação da tabela: utf8_general_ci
       
      Se alguém tiver uma luz...
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.