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

(Resolvido) GROUP BY do ultimo registro cadastrado


Karramax

Pergunta

Olá galera,

Estou com um probleminha numa consulta MySql. Bom, eu tenho uma tabela de notícias onde vários usuários postam as notícias. Eu gostaria de agrupar essas notícias por usu_id (campo da tabela notícias) mas que me mostrasse apenas o último registro de notícia de cada usuário. Vou postar o código que tenho que não funciona como eu quero:

SELECT not_id, not_titulo, not_subtitulo, not_texto, not_user FROM noticias WHERE not_status = 'S' GROUP BY not_user DESC ORDER BY not_id DESC LIMIT 8

Esse código até que agrupa as notícias de cada usuário, mas me retorna apenas a primeira notícia cadastrada pelos usuários, eu queria que ele agrupasse e retornasse a última notícia de cada usuário.

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'Karramax'

Muita gente desvirtua o uso do GROUP BY e você não foi exeção. O GROUP BY deve ser usado para agrupamentos obtendo somas, quantidades, médias, etc.

A solução de seu problema passa por outra insturção, que é:

SELECT n1.not_id, n1.not_titulo, n1.not_subtitulo, n1.not_texto, n1.not_user 
FROM noticias n1
WHERE n1.not_status = 'S' AND n1.not_id = (SELECT max(n2.not_id) 
                  FROM noticias n2
                  WHERE n2.not_user = n1.not_user)

Link para o comentário
Compartilhar em outros sites

  • 0

Vê se ajuda...

Criando as tabelas de usuários e incluindo informações

create table `usuario` (
idusuario integer unsigned not null auto_increment,
nome varchar(30),
primary key (idusuario)
) engine=InnoDb;

insert into `usuario`
(nome) values
("Paulo"),
("Joao"),
("Maria");

create table `noticias` (
idnoticia integer unsigned not null auto_increment,
idusuario integer unsigned default 0,
noticia varchar(50) not null default '',
datahora timestamp,
primary key (idnoticia)
) engine=InnoDb;
Incluindo algumas notícias...
insert into `noticias`
(idusuario, noticia, datahora)
values
(1, "Morreu o gato da vovó", "2009/08/01 10:15:20"),
(1, "O ônibus atrasou hoje", "2009/08/02 12:25:20"),
(1, "Vovó chora no enterro do gatinho", "2009/08/03 10:35:00"),
(2, "Preço do Trigo abaixa 5%", "2009/08/01 10:00:00"),
(2, "Aumenta o Consumo de Carne", "2009/08/06 18:15:00"),
(3, "Encontrada a cura para a gripe A", "2009/07/31 18:00:00"),
(3, "Procura-se Susan desesperadamente", "2009/08/04 10:00:00");
Selecionando a notícia mais recente de cada usuário. Isso, depois, será uma subquery.
select max(datahora), idusuario
from `noticias`
group by idusuario
Agora que sei qual é a notícia mais recente de cada usuário, ligo as notícias e usuários com essa subquery... Aí vai um exemplo:
select a.idusuario, a.noticia, a.datahora
from `noticias` as a
inner join
  (select max(datahora) as datahora, idusuario
   from `noticias`
   group by idusuario
  ) as b
on (a.idusuario=b.idusuario and a.datahora=b.datahora)

Ok?

Espero ter ajudado!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

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