Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Anderson Baldner

Group By, retornando valores errados

Recommended Posts

Amigos, quebrei a cabeça por 3 dias, e não consegui;. tenho que pedir ajudar aos universitários.

Bem, o meu sistema é um sistema de mensagens enviadas e recebedias. Ou seja, Ao listar as mensagens, estou pesquisando pelo ID do usuários, e agrupando com GROUP BY pelo usuário que enviou a mensagem para tal usuário. Sendo que ao dar um GROUP BY, ele ignora muitos registros.

Por exemplo, se eu der um SELECT e usar um ORDER BY, ele me retorna os seguintes registros:

 

SELECT * FROM `menssagens` WHERE Envpara = '7' ORDER BY ID DESC

ele me retorna:

 

 ID                DATA               HORA  ASSUNTO       TEXTO     Envpor   Envpara
29914 	2013-01-24 	01:04:22 	  TESTE    	TESTE	283 	       7
29912 	2013-01-24 	00:07:48 	   chat	        teste	283         7
29907 	2012-11-12 	20:58:47 	   chat	 Ownnn...	646         7 	
9904 	2012-11-12 	11:19:52 	   chat	Hahaha...	        646         7 

Bem, como podem ver, orientado ao ID DESC, vem a mensagem de um usuário com o ID 283

 

Porém, se eu uso um GROUP BY, ele ignora esse Usuário com ID 283, e chama um usuário que nem aparece nessa lista dos ultimos que enviaram mensagem para o usuário com ID 7, que é o usuário logado.

 

SELECT * FROM `menssagens` WHERE Envpara = '7' GROUP BY Envpor ORDER BY ID DESC

ao realizar a consulta acima, ele me retorna valores aleatórios, como:

 ID                 DATA              HORA         TITULO                  TEXTO                          Envpor   Envpara
29848 	2012-09-29 	16:53:40   	chat	            Tudo ótimo! :D...	    372 	     7 	

 

Pela logica, deveria agrupar primeiro a do usuário 283, que foi o ultimo a mandar mensagem para o usuário de ID 7, mas não é assim que está me retornando.

 

Alguém sabe me dar uma luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

"*" é group by não faz muito sentido, group se usa com lista ou para totalizar

 

 

SELECT Envpor FROM `menssagens` WHERE Envpara = '7' GROUP BY Envpor ORDER BY ID DESC

 


 

 

SELECT Envpor, count(Envpor) qtd FROM `menssagens` WHERE Envpara = '7' GROUP BY Envpor ORDER BY ID DESC

 




			
		

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isso que o @Motta respondeu. :clap:

 

"The GROUP BY statement is used in conjunction with the aggregate functions to group the result-set by one or more columns."

 

Mais informações => SQL GROUP BY

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo. O que me indicariam pra eu simplesmente agrupar, de maneira que ao invés de exibir duas mensagens que o usuário 258 mandou pro usuário de ID 7, apareça uma única vez, não seguidas como o SELECT simples utiliza?

Eu só precisaria que ele fizesse um SELECT DESC, e mostrasse as informações agrupadas, pra que elas não se repitam inúmeras vezes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo o chat do Facebook? Não tenho idéia como é o código deles...

 

Mas talvez fazer esse Select e concatenar as mensagemns de forma que no final de uma mensagem, colocasse um <br /> no final para pular a linha, algo desse jeito?

 

Isso seria uma troca de msg`s do 258 e do 7 ? ai teria que trabalhar com as datas das mensagem tbm para não listar todas de um soh e depois todas de um outro...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quase igual o chat do Facebook, só que não a maneira que exibe as mensagens do chat, mas sim as conversas que ficam no canto direito da caixa de mensagens. Sabe como é?

Ali aparecem conversas separadas por usuários. Basicamente, é feito o que pela logica que consigo ver, o GROUP BY deveria fazer.Ele Ordenar, depois agrupar. Se fosse assim, seria perfeito, mas tá parecendo que vou quebrar um pouco mais a cabeça pra resolver esse problema.

Aceito sugestões!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu havia me esquecido do DISTINCT!

Fiz a modelagem no PhpMyAdmin, e rolou tudo certo. ele selecionou exatamente da forma que eu queria, mas quando peguei exatamente o mesmo código e executei em uma página PHP, o resultado voltou a ser insatisfatório. Alguém já pegou um problema desses?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fazer:

 

SELECT * FROM TABELA GROUP BY USUARIO;

 

é tão errado quanto

 

SELECT DISTINCT * FROM TABELA;

 

Especifique no SELECT as colunas que não pertinentes ao agrupamento que você precisa.

 

SELECT DISTINCT USUARIO, MENSAGEM FROM TABELA;

 

ou

 

SELECT USUARIO, MENSAGEM FROM TABELA GROUP BY USUARIO;

 

Acho que o que você quer deve ser algo assim (isso é um chute):

 

 

SELECT Envpor, MAX(Data) as Envdata, MAX(Hora) as Envhora, Assunto, Texto
FROM mensagens
WHERE Envpara = '7'
GROUP BY Envpor, Assunto, Texto
ORDER BY Envdata DESC, Envhora DESC

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema, é que eu preciso do campo Envpor e do campo Mensagem. Se eu incluir o campo mensagem no DISTINCT, ele me retorna campos repitidos no Envpor.

Algo que parecia muito simples, está me pirando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu incluir o campo mensagem no DISTINCT, ele me retorna campos repitidos no Envpor.

 

Isto não lhe parece lógico? Se a mensagem é diferente, não importa quem enviou.

Talvez você esteja querendo algo com um group_concat().

 

Olhando para os 4 registros que você listou lá no começo, como é a saída esperada?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ou algo como ...

 

 

SELECT *

FROM mensagens M1

WHERE Envpara = '7' and data = (SELECT MAX(Data)

FROM mensagens M2

WHERE M2.Envpara = M1.Envpara)

 




			
		

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, para ilustrar melhor, tirei um print da tela do Facebook.

Reeparem que com um COUNT, ele me mostra que o primeiro usuário me enviou duas mensagens, porém ele só mostra a ultima enviada por ele.

Eu não tenho dificuldades com o JOIN, nem com o COUNT. Só estou tendo uma puta dificuldade, pra agrupar os registros, compreendem?sdasda1359147544_min.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se isso lhe atende:

 

 

SELECT Envpor, MAX(Data) as Envdata, Texto, count(1) as Contmsg
FROM mensagem
WHERE Envpara = '7'
GROUP BY Envpor
ORDER BY Envdata DESC

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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