Array
(
)

listar dados mysql

PHP
Paulo Sérgio
   - 18 mar 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
#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

Din
|
MVP
Pontos: 45
    21 mar 2014

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

Marcio Araujo
   - 23 mar 2014

acho que deve usar isso na query

#Código

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


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

e tem esse link:

http://www.mauricioprogramador.com.br/posts/como-ordenar-array-php-ordem-crescente-e-decrescente

Din
|
MVP
Pontos: 45
    24 mar 2014

Creio que o seu problema de duplicar dados seja na sua query
#Código

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
http://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...

Paulo Sérgio
   - 24 mar 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

Din
|
MVP
Pontos: 45
    24 mar 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....

Paulo Sérgio
   - 25 mar 2014

Como seria isso?

Marcio Araujo
   - 30 mar 2014

Paulo Sérgio, deu certo?

Din
|
MVP
Pontos: 45
    02 abr 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 ...

David Sylvestre
   - 02 abr 2014

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