Ir para conteúdo
JHenry

Como selecionar linhas distintas depois de ordenar e agrupar?

Recommended Posts

Fala pessoa, blz!?

 

Tenho uma dúvida que empacou todo o meu projeto e preciso muito de ajuda!

 

É o seguinte... dado a tabela abaixo:

post    |   data    |   tags
--------+-----------+-------
post3   |   2016    |   bbb
post1   |   2018    |   aaa
post2   |   2017    |   ccc
post1   |   2018    |   bbb
post3   |   2016    |   aaa
post2   |   2017    |   bbb
post2   |   2017    |   bbb
post1   |   2018    |   ccc
post3   |   2016    |   ccc

 


Eu quero obter como resultado final a seguinte tabela:

post    |   data    |   tags
------- +---------- +--------
post1   |   2018    |   aaa
post2   |   2017    |   bbb
post3   |   2016    |   ccc

 


Ou seja, o que que eu quero fazer é: Primeiramente, ordenar a tabela em função de uma coluna (que neste caso é a coluna data). Quero, em segunda lugar, agrupar em função duma outra coluna (que neste caso é a coluna tag). E quero, por fim, que o resultado da coluna post não se repita.

A primeira e a segunda parte eu sei fazer. Eu aplico a query abaixo...

OBS: A ordem não precisa ser necessariamente esta acima...

SELECT post, `data`, tag
FROM tabela AS t1
WHERE t1.`data` = (
    SELECT MAX(t2.`data`) 
    FROM tabela AS t2 
    WHERE t1.tag = t2.tag
) 

 


... e obtenho o seguinte resultado:

post    |   data    |   tags
------- +---------- +--------
post1   |   2018    |   aaa
post1   |   2018    |   bbb
post1   |   2018    |   ccc

 


O problema, como vocês podem ver, é que o post1 se repete para todas as tags. E eu não quero que isso aconteça. Quero que todas as linhas sejam preenchidas inteligentemente em função do maior valor dado pela coluna data, mas sem haver repetição na coluna post.

 

Como posso fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT post, `data`, tag
FROM tabela AS t1
WHERE t1.`data` = (
    SELECT MAX(t2.`data`) 
    FROM tabela AS t2 
    WHERE t1.tag = t2.tag
    and t1.post = t2.post
) 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 hours ago, Motta said:

SELECT post, `data`, tag
FROM tabela AS t1
WHERE t1.`data` = (
    SELECT MAX(t2.`data`) 
    FROM tabela AS t2 
    WHERE t1.tag = t2.tag
    and t1.post = t2.post
) 

 

 

Não funcionou...

 

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 AllysonSouza
      Boa noite, to precisando de ajuda, eu to listando os dados direto do banco de dados em um tabela, so que ela faz isso linha por linha como é feito, eu queria que ele listasse duas tabelas na mesma pagina, só que dando continuidade da busca do banco de dados, exemplo. ele busca 50 resultados no banco, ai ele pega o maximo de linhas possivel em uma tabela, e do outro lado da tela ele lista o restante dos dados...enfim, eis meu codigo, exibindo tudo em uma tabela só
      <?php $categoria = $_GET['categoria']; $sql = "SELECT p.id AS idProd, p.nome AS produto, p.largura, p.comprimento, p.estilo, p.valor, p.valorCompra, p.estoque, p.imagem, c.id AS idCat, c.nome AS categoria, p.vendidos, p.tipo, p.detalhe FROM produtos p INNER JOIN categorias c ON p.categorias_id=c.id WHERE c.id=$categoria ORDER BY p.nome, p.largura ASC"; $res = mysqli_query($con, $sql); $dados = mysqli_fetch_array($res); ?> <div class="panel-footer"> <table class="table table-bordered table-hover text-center"> <thead > <tr ><td colspan="5" style="text-align: center;"> <?php echo $dados['categoria']?></td></tr> </thead> <thead > <tr > <th width="250" class="text-center" >Nome</th> <th width="10" class="text-center">Tamanho</th> <th width="100" class="text-center">Valor</th> </tr> </thead> <tbody> <?php while($linha = mysqli_fetch_array($res)){ ?> <tr > <td > <?php echo $linha['produto']; echo " "; echo $linha['largura'] ; echo " "; echo $linha['detalhe']; echo" "; if($linha['estilo']==0){ echo ''; }else if($linha['estilo']==1){ echo '(Bruta)'; }else if($linha['estilo']==2){ echo '(Plainada)';}?> <label class='label label-danger'><?php if($linha['tipo'] == 0 ){ echo 'ML';}; ?></label> <label class='label label-primary'><?php if($linha['tipo'] == 1 ){ echo 'M²';}; ?></label> <label class='label label-warning'><?php if($linha['tipo'] == 2 ){ echo 'Peça';}; ?></label> <label class='label label-info'><?php if($linha['tipo'] == 3 ){ echo 'Duzia';}; ?></label> <label class='label label-success'><?php if($linha['tipo'] == 4 ){ echo 'KG';}; ?></label> </td> <td><?php if($linha['comprimento']==0){ echo '1 M '; }else if($linha['comprimento']==1){ echo '3 M'; }else if($linha['comprimento']==2){ echo '4 M'; }else if($linha['comprimento']==3){ echo '5 M'; }else if($linha['comprimento']==4){ echo '6 M'; }else if($linha['comprimento']==5){ echo ''; } ?></td> <td> <?php echo Conversor::realBancoParaUsuario($linha['valor']); ?> </td> </tr> <?php } ?> </tbody> </table> </div>  
    • Por Gemeons
      SELECT tabehist.HIST_Descricao, `vw_saldobancario`.`codigoHistorico`, (SELECT SUM(debitos + debitosPendentes) FROM vw_saldobancario WHERE mes = '1' AND `conta_bancaria_id` = '3' AND vw_saldobancario.codigoHistorico = tabehist.HIST_Codigo) AS 'mes1', `vw_saldobancario`.`conta_bancaria_id` FROM vw_saldobancario INNER JOIN tabehist ON vw_saldobancario.codigoHistoricod = tabehist.HIST_Codigo AND `ano` = '2018' AND `conta_bancaria_id` = '3' AND codigoHistorico < 500 GROUP BY codigoHistorico  
      A query e montada a partir dessa função aonde contem um for que vai montando o meses partir do que o usuário pede .
       
      { $dataInicio = (int)$dataInicio; $i = 0; $query = "SELECT tabehist.HIST_Descricao, `vw_saldobancario`.`codigoHistorico`, "; for ($i = $dataInicio ; $i <= $dataFim; $i++) { $query = $query. "(SELECT SUM(debitos + debitosPendentes) FROM vw_saldobancario WHERE mes = '{$i}' AND `conta_bancaria_id` = '{$contaBancaria}' AND vw_saldobancario.codigoHistorico = tabehist.HIST_Codigo) AS 'mes{$i}',"; } $query = $query. " `vw_saldobancario`.`conta_bancaria_id` FROM vw_saldobancario INNER JOIN tabehist ON vw_saldobancario.codigoHistorico = tabehist.HIST_Codigo AND `ano` = '{$ano}' AND `conta_bancaria_id` = '{$contaBancaria}' AND codigoHistorico < 500 GROUP BY codigoHistorico "; return $this->db->query($query)->result(); }  
    • Por fabio3050
      Bom dia, amigos não sou desenvolvedor estou desenvolvendo uma plataforma com um pessoal fora dos Brasil, mas não estou conseguindo explicar a melhor forma para fazer esse código será que podem me ajudar.
       
      Foi feito 2 botões onde esses botões precisa executar um campo dentro do mysql porque nesse campo vai vim Via API um PDP, e esse botão somente precisa executar esse campa para que gere esse PDF, alguém pode colocar de forma técnica para que eu posso enviar pra eles!
       
       
      Muito Obrigado
    • Por mbdec
      ola pessoal! 
      gostaria da ajuda de vocês para criar botões executando funções mysql.
      aqui esta a função mysql trazer o result set e fazer echo
      é um sistema de nutricionismo ele faz comparações no banco de dados, então queria criar botões para executar as açoes e "echo" para exibir os resultados 
      Tabela Alimento:
      Alimento_ID Nome


      Tabela Beneficios_Males Beneficios_Males_ID Nome Tipo('B','M') (Se é beneficio ou Males)   Tabela Alimento_Beneficios_Males Alimento_ID
      Beneficios_Males_ID     Por exemplo, trazer todos os alimentos e seus beneficions

      SELECT Alimento.*, Beneficios_Males.* FROM Alimento JOIN Alimento_Beneficios_Males USING (Alimento_ID) JOIN Beneficios_Males USING (Beneficios_Males_ID) WHERE Tipo = 'B';   Por exemplo, trazer todos os alimentos e seus males   SELECT Alimento.*, Beneficios_Males.* FROM Alimento JOIN Alimento_Beneficios_Males USING (Alimento_ID) JOIN Beneficios_Males USING (Beneficios_Males_ID) WHERE Tipo = 'M';   ____________________________              -     |botão para executar a ação|               label para o echo         label para o echo ____________________________              --------------------------          ---------------------------     |botão para executar a ação| ------------------------------------
×

Informação importante

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