Jump to content
  • 0
AnthraxisBR

Usar MAX(date) em datetime e GROUP BY não devolve a maior data

Question

Preciso retirar de um tabela, os últimos registros ordenando pela data, e agrupar em seguida, mantendo a ordem, mas não da pra por um GROUP BY depois de ORDER BY, tentei de tudo quanto é jeito.

A tabela:

CREATE TABLE `internal_users_groups_change_history` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod` varchar(50) NOT NULL,
  `relacionated_group` varchar(50) NOT NULL,
  `relacionated_collaborator` varchar(50) NOT NULL,
  `date` datetime NOT NULL,
  `type` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=latin1;

Com os dados:

 

id  | cod | relacionated_group | relacionated_collaborator | date                                | type

1   | abc |  group_1                     |   user_1                                  | 2017-06-21 10:23:16  | 1

2   | acd | group_1                      |   user _2                                 | 2017-06-21 10:23:16 |  1

3   | aef  | group_1                      |   user_3                                  | 2017-06-21 13:11:42 | 1

4   | rgt   | group_1                      |   user_2                                 | 2017-06-21 13:47:30  | 2

 

Onde o que eu quero, é buscar os dados pelo grupo, e listar os colaboradoradores, mas apenas o ultimo dado de cada colaborador deve ser exibido.

 

Tentando com MAX(date) e INNER JOIN:

SELECT a.* 
FROM internal_users_groups_change_history a
INNER JOIN (
  SELECT *, MAX(date) AS date_updated
  FROM internal_users_groups_change_history GROUP BY relacionated_collaborator
) AS max USING (id, relacionated_collaborator);

Assim, ela me responde

id  | cod | relacionated_group | relacionated_collaborator | date                                | type

1   | abc |  group_1                     |   user_1                                  | 2017-06-21 10:23:16  | 1

2   | acd | group_1                      |   user _2                                 | 2017-06-21 10:23:16 |  1

3   | aef  | group_1                      |   user_3                                  | 2017-06-21 13:11:42 | 1

 

Tentei colocando uma tabela dentro da outra:

 


SELECT * FROM ( 
    SELECT id,cod,relacionated_group,relacionated_collaborator,date,type
    FROM internal_users_groups_change_history 
    WHERE relacionated_group = "199269352594a7344a21008.97800859" 
    ORDER BY id DESC
)  tmp_tbl GROUP BY tmp_tbl.relacionated_collaborator

Assim ela também me responde a mesma coisa:

id  | cod | relacionated_group | relacionated_collaborator | date                                | type

1   | abc |  group_1                     |   user_1                                  | 2017-06-21 10:23:16  | 1

2   | acd | group_1                      |   user _2                                 | 2017-06-21 10:23:16 |  1

3   | aef  | group_1                      |   user_3                                  | 2017-06-21 13:11:42 | 1

 

Ai eu desisti, e fiz no php, funcionou, mas quando eu parei pra pensar, se essa tabela ficar grande, isso vai ser um problema.

 

A resposta ideal seria:

 

id  | cod | relacionated_group | relacionated_collaborator | date                                | type

1   | abc |  group_1                     |   user_1                                  | 2017-06-21 10:23:16  | 1

3   | aef  | group_1                      |   user_3                                  | 2017-06-21 13:11:42 | 1

4   | rgt   | group_1                      |   user_2                                 | 2017-06-21 13:47:30  | 2

 

 

Alguém sabe indicar algum método de dar o group by depois do order by ?

 

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 0

@AnthraxisBR, buenas.

 

Tu não pode fazer p Max no id da tabela, agrupando pelo campos que tu precisa? Fiquei meio confuso com o teu detalhamento, mas costumo trabalhar com uma lógica parecida.

No caso, tu poderia fazer um INNER JOIN pelo ID da tabela principal com o MAX(ID) do sub select.

  • +1 1

Share this post


Link to post
Share on other sites
  • 0

Hmmm...

 

Desconfio do nome do campo "date", tente mudar o nome do campo.

Embora que, em testes que fiz aqui, tudo parece funcionar normalmente.

 

https://dev.mysql.com/doc/refman/5.5/en/keywords.html

  • +1 1

Share this post


Link to post
Share on other sites
  • 0

@Marlon Pacheco Eu tentei fazer assim, mas enchi de dados pra testar, e acabou ficando lento, não daria certo com id, nem com date.

 

@Prog Eu entendi o que estava acontecendo, ele estava literalmente, puxando MAX(date) como campo, não interpretando como parâmetro da query.

 

Solucionei da seguinte forma, mudando o padrão do banco x interação:

 

Ao fazer a inserção do dado seria o dado que iria conter o MAX(date), ele faz uma verificação nos dados anteriores da tabela que continuam o TYPE = 1.

 

Todos os dados inseridos anteriormente nessa tabela tinham como padrão:

 

1 -> Colaborador 'collab_cod' entrou no grupo 'group_cod' na data xx/xx/XXXX

2 -> Colaborador 'collab_cod' saiu do grupo 'group_cod' na data xx/xx/XXXX

 

Alterei o padrão para:

 

0 -> Colaborador 'collab_cod' deixou o grupo 'group_cod' na data xx/xx/XXXX , porém usar TYPE != '0' na consulta pelos últimos dados.

1 -> Colaborador 'collab_cod' entrou no grupo 'group_cod' na data xx/xx/XXXX

2 -> Colaborador 'collab_cod' deixou o grupo 'group_cod' na data xx/xx/XXXX

 

Ficou até melhor na documentação, pois tenho a ultima saída, a última entrada, e 0 como padrão para fora do grupo.

 

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 gersonab
      Bom dia, tenho um select onde gostaria de ordenar o mesmo pelo dia do campo date , segue o mesmo 
      $mesatual = date("m"); $consulta = $pdo->query("SELECT * FROM cli WHERE MONTH(datan) = '$mesatual' ORDER BY DAY(datan) ASC"); não esta ordenando o mesmo, teria de ser pelo dia, pois o mês vai ser sempre o atual e o ano varia conforme data de nascimento.
       
      exemplo de como esta aparecendo :
      18/07/2019
      14/07/2019
      preciso que seja assim :
      14/07/2019
      18/07/2019
    • By Igor Gabriel
      Boa Tarde, estou com uma dúvida.
       
      Estou criando um site para uma imobiliárias, fiz um sistema de cadastro todo bonitinho onde se encontra funcionando perfeitamente. Contudo fora do sistema, no site, quando clico para ver os imoveis, tenho a listagem de todos os imoveis já cadastrados. Quando entro na página para ver mais do Imóvel é trazido consigo todas as informações presentes no banco, ao invés de uma só. Como faço para trazer uma única informação específica do banco?
    • By leocouto
      Pegar um dado específico de uma tabela, caso tenha mais de um item cadastrado sempre vai pegar o último.
      <form name="editaFornecedor"<?php +1?> action="edit_forne.php" id="editaFornecedor" method="POST"> <!-- Pegando todos os fornecedores cadastrados... --> <table class="table table-striped"> <thead class="thead-dark"> <tr> <th scope="col">ID</th> <th scope="col">Nome</th> <th scope="col">Fone</th> <th scope="col">CNPJ</th> <th scope="col">Rua</th> <th scope="col">Número</th> <th scope="col">Bairro</th> <th scope="col">Estado</th> <th scope="col">Cidade</th> <th scope="col">CEP</th> <th scope="col">E-mail</th> <th scope="col">Observação</th> <th scope="col">Editar|Deletar</th> </tr> </thead> <?php @session_start(); include('conexao.php'); $fornecedor = mysqli_query($conexao, "SELECT * FROM fornecedor"); $linhas = mysqli_num_rows($fornecedor); while ($linhas = mysqli_fetch_array($fornecedor)) { ?> <tbody> <tr> <td><?php echo $linhas['id_fornecedor']; ?></td> <td><?php echo $linhas['nome']; ?></td> <td><?php echo $linhas['fone']; ?></td> <td><?php echo $linhas['cnpj']; ?></td> <td><?php echo $linhas['rua']; ?></td> <td><?php echo $linhas['numero']; ?></td> <td><?php echo $linhas['bairro']; ?></td> <td><?php echo $linhas['estado']; ?></td> <td><?php echo $linhas['cidade']; ?></td> <td><?php echo $linhas['cep']; ?></td> <td><?php echo $linhas['email']; ?></td> <td><?php echo $linhas['observacao']; ?></td> <td> <button type="submit" class="btn btn-secondary" style="height: 35px; width: 100px"><i class="material-icons">description</i>Editar</button><br> <button type="button" class="btn btn-danger" style="height: 35px; width: 100px"><i class="material-icons">delete</i>Deletar</button> </td> <td><input type="text" name="id_fornecedor" value="<?php echo $linhas['id_fornecedor'];?>"></td> </tr> </tbody> <?php } ?> </table> <!-- Fim da exibição de todos os fornecedores cadastrados.. --> </form>  
       
      ======================================================================================================================================================
      Aqui no MYSQL só pega o último item da tabela.. Não pega o que foi clicado no botão.
      <?php include('conexao.php'); session_start(); //$cnpj=$_POST['cnpj']; $id_fornecedor=$_POST['id_fornecedor']; echo $id_fornecedor; ?> =======================================================================================================================================================
      É desse modelo da imagem, mas na hora que clico em editar no mysql aparece o último id e não na linha que cliquei, se eu clicar no primeiro na outra página aparece o id 4, que é o ultimo, quem pode me dar essa força? Ficarei muito grato.

    • By Felipe_N22
      Pessoal, como que eu crio uma rotina no MySQL para efetuar delete de registros inseridos nos últimos 30 dias, e fazer com que esse procedimento rode todos os dias automaticamente em determinado horário?
    • By xuxutrader
      Fala pessoal, sou novato na área.
      To fazendo um site em wordpress que irá pegar as cotações de ações de um banco de dados (já possuo o banco de dados). Gostaria de saber como que eu faço pra colocar o resultado (o banco de dados) na página do wordpress.
       
      No caso eu gostariia de mostrar o resultado (não é nem uma query, é a tabela mesmo) numa página do meu site.
       
      Obrigado por quem puder me ajudar
×

Important Information

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