listar dados mysql
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
Ele funciona, porem quando eu tento fazer a paginação ele começa a repetir os dados
alguém me ajuda
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
Curtidas 0
Respostas
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
18/03/2014
acho que deve usar isso na query
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]
"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
18/03/2014
Creio que o seu problema de duplicar dados seja na sua query
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...
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
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
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
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
18/03/2014
Como seria isso?
GOSTEI 0
Marcio Araujo
18/03/2014
Paulo Sérgio, deu certo?
GOSTEI 0
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 ...
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
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