listar dados mysql

PHP

18/03/2014

Galera to com o seguinte problema

tenho uma tabela de mensagens onde tenho id, quem postou, onde postou e data
meu problema é o seguinte
quero agrupar os resultados de acordo com quem postou

digamos
1 - fulano - perfil - 2014-03-18 15:03:01
1 - outro- perfil - 2014-03-18 15:05:01
1 - fulano - perfil - 2014-03-18 15:06:01
1 - outro- perfil - 2014-03-18 15:07:01
1 - fulano - perfil - 2014-03-18 15:08:01

quero que ele fique assim
1 - fulano - perfil - 2014-03-18 15:08:01
1 - outro- perfil - 2014-03-18 15:07:01

agrupando por usuário e listando a com a data mais recente
tenho o seguinte código

function listaMsgs($conecta,$pagina,$usuario,$limite,$last,$tipo){
	
	if($pagina == $usuario){$privacidade = '0';}else{$privacidade = '1';}
	
	if($last==0){$vejamais='';}else{$vejamais=" AND m_id<$last ";}

	$query = "SELECT * FROM (SELECT M.*, U.u_id, U.u_url, U.u_titulo, U.u_opcoes, O.o_imagem FROM mensagens M, usuarios U, opcoes O WHERE m_usuario = ? AND u_id = M.m_realizou AND o_codigo = U.u_opcoes $vejamais GROUP BY m_realizou ORDER BY m_data DESC LIMIT $limite) as mensagens GROUP BY m_realizou ORDER BY m_data DESC";
	try{
		$reQuery = $conecta->prepare($query);
		$reQuery ->execute(array($pagina));
		$retorno = $reQuery->fetchAll(PDO::FETCH_ASSOC);
	}catch(PDOException $e){
		echo $e->getMessage();
	}
	
	$encontrados = count($retorno);
	if($encontrados == 0){
		$dep = '';
	}else{
		$dep = $retorno;
	}
	
	return array('Quantidade'=>$encontrados, 'Mensagens'=>$dep);
}



Ele funciona, porem quando eu tento fazer a paginação ele começa a repetir os dados
alguém me ajuda
Paulo Sérgio

Paulo Sérgio

Curtidas 0

Respostas

Claudio Lopes

Claudio Lopes

18/03/2014

Fazendo a query no phpmyadmin, ele repede os dados? se sim, vc tem um erro no relacionamento das tabelas.....
GOSTEI 0
Marcio Araujo

Marcio Araujo

18/03/2014

acho que deve usar isso na query

"ORDER BY coluna ASC" ou "ORDER BY coluna DESC"


não tenho certeza se vai dar certo, achei um site.

e tem esse link:

[url]http://www.mauricioprogramador.com.br/posts/como-ordenar-array-php-ordem-crescente-e-decrescente[/url]
GOSTEI 0
Claudio Lopes

Claudio Lopes

18/03/2014

Creio que o seu problema de duplicar dados seja na sua query
SELECT 
	* 
FROM 
   (SELECT 
		M.*, 
		U.u_id, 
		U.u_url, 
		U.u_titulo, 
		U.u_opcoes, 
		O.o_imagem 
	FROM 
		mensagens M, 
		usuarios U, 
		opcoes O 
	WHERE 
		m_usuario = ? 
		AND u_id = M.m_realizou AND 
		o_codigo = U.u_opcoes $vejamais 
	GROUP BY 
		m_realizou 
	ORDER BY 
		m_data DESC 
	LIMIT $limite) as mensagens 
GROUP BY 
	m_realizou 
ORDER BY 
	m_data DESC


O mais comun é usar left join, join e etc, porem vc faz um relacionamento direto, dai nao saberia lhe esplicar. Outro ponto é que você está usando uma sub query, bom dai fica a dica, sua query é muito grande, seria bom identa-la, porem seu codigo php ficaria grande. Use Procedures e passe parametros que você queira utilizar como crítérios, assim fica mais facil até de dar manutenção.

segue o link para pesquisa
https://www.devmedia.com.br/procedures-e-funcoes-no-mysql/2550

faça a consulta no sql e print o resultado veja se o resultado da query duplica seus dados...
GOSTEI 0
Paulo Sérgio

Paulo Sérgio

18/03/2014

Consegui resolver o problema...
Primeiro eu fiz uma quero listando o 1 post por vez e apliquei o o ORDER BY, depois joguei eles dentro de um foreach e então fiz a nova consulta fazendo comparando os ids
GOSTEI 0
Claudio Lopes

Claudio Lopes

18/03/2014

Cara veja se isso será a melhor saída, você está fazendo duas querys, sendo que você teria mais desempenho fazendo apenas uma vez....
GOSTEI 0
Paulo Sérgio

Paulo Sérgio

18/03/2014

Como seria isso?
GOSTEI 0
Marcio Araujo

Marcio Araujo

18/03/2014

Paulo Sérgio, deu certo?
GOSTEI 0
Claudio Lopes

Claudio Lopes

18/03/2014

Paulo voce fez assim

1ª query roda os dados

então você percorre o array com o foreach e o resultado voce faz outra query
então pegando um resultado e colocando na condição where


Porém, no procedimento antigo vc tinha dados duplicados devido aos seus relacionamentos do banco... os seus on, se vc verificar onde está isso, vc para de fazer o procedimento assima.

Vou lhe aplicar um exemplo:



sem a primeira query te reorna 300 linhas, e a segunda te retorna 10 linhas.... então pra cada linha da primeira consulta vc dispara uma consulta no banco...
dependendo do seu volume e a longo prazo... isso pode afetar o desempenho ...





GOSTEI 0
David Sylvestre

David Sylvestre

18/03/2014

Não seria muito mais simples dar um MAX na data para retornar a ultima postagem agrupando por usuário não???
GOSTEI 0
POSTAR