Fóruns sobre PHP, JavaScript, HTML, MySQLi, jQuery, Banco de Dados, CSS


Moderador: web

 
Primeiras postagens
Primeiras postagens
Tópico Autor
Mensagens: 2
Sexo: Masculino

SQL AVANCADO - Duvida sobre consulta

22-02-2012 19:59

Olá :hai: , já estou na área de programador :geek: há alguns anos e tenho uma certa experiência em banco de dados. Atualmente estou utilizando o BD MySQL, até que surgiu um desafio, uma consulta que estou batendo a cabeça para resolver no momento :fubar: . O problema é o seguinte:

Não vou colocar o problema real, vou inventar um cenário bem mais simplificado para melhor entenderem o problema:

Tenho uma tabela "log" que guarda as ultimas ações de um determinado usuario:

: Tabela log :
: id : id_usuario : acao :
: 1 : 1 : logou no sistema :
: 2 : 2 : logou no sistema :
: 3 : 1 : criou registro a :
: 4 : 1 : criou registro b :
: 5 : 2 : criou registro c :
: 6 : 1 : alterou registro a :
: 7 : 2 : logoff no sistema :
: 8 : 2 : logou no sistema :
: 9 : 1 : apagou registro b :
: 10 : 1 : logoff no sistema :

A consulta que eu quero é a seguinte: Retornar os 3 últimos registros de cada usuario.

A primeira vista parece fácil não é mesmo? Mas não é tão simples assim.

Qual a saída que eu poderia adotar: Utilizar a seguinte select para cada usuário:

select * from log
where id_usuario = 1
order by id desc
limit 3;

e

select * from log
where id_usuario = 2
order by id desc
limit 3;

Com essas duas query's (é o mesmo select mas uma para cada usuário) eu recebo exatamente o que eu quero: Os 3 últimos registros para cada usuário. Mas é aí que está a questão, no meu problema real eu necessito os ultimos 100 registros e são 300 usuários. Ou seja, para que eu conseguisse o resultado usando esse método eu teria que fazer 300 select (um para cada usuário), isso é totalmente inaceitável. Eu teria que fazer um laço for na minha aplicação e cada laço rodar um select que retorna 300 registros, não tem cabimento implementar algo assim, o ideal seria executar uma query que retornasse 3000 registros e neles estivesse exatamente 100 registros de cada usuário. Entenderam agora a complicação?

Caso vocês saibam uma maneira de conseguir o mesmo resultado com apenas uma query por favor não hesitem em ajudar!

Obrigado!
0
 
Avatar do usuário
ADMIN
ADMIN
Mensagens: 17639
Nome: Kleber
Descrição do site: Onde você encontra scripts grátis para o seu site
Sexo: Masculino
Localização: RJ / RJ / Brasil
Contato:

SQL AVANCADO - Duvida sobre consulta

22-02-2012 20:08

Isso é bem complicado, vou ver se acho uma dica para te ajudar.
0
A melhor hospedagem para o seu site HostGator!
 
Avatar do usuário
ADMIN
ADMIN
Mensagens: 17639
Nome: Kleber
Descrição do site: Onde você encontra scripts grátis para o seu site
Sexo: Masculino
Localização: RJ / RJ / Brasil
Contato:

SQL AVANCADO - Duvida sobre consulta

22-02-2012 20:16

Não sei se seria a melhor solução. Eu faria o seguinte:

Uma consulta para retornar os usuários. Nesse caso, eu poderia fazer algo tipo ...WHERE id > ... < ...

Isso para pegar todos os ids daquela sequência.

Agora para pegar os 3 últimos resultados de cada id, eu criaria uma função fora do while, para retornar os 3 últimos resultados do ip passado, usando o return para devolver o valor para o id da listagem.
0
A melhor hospedagem para o seu site HostGator!
 
Primeiras postagens
Primeiras postagens
Tópico Autor
Mensagens: 2
Sexo: Masculino

SQL AVANCADO - Duvida sobre consulta

24-02-2012 11:51

Entendi sua idéia web... mas para isso eu não fugiria da necessidade de buscar os ultimos registros usuario por usuario certo? Eu gostaria de uma query sem laços, não sei se isso é possível, mas eu já vi cada coisa em algumas query's que nem podia imaginar que existia, que acabo acreditando que existe sim um modo mais "simples".
0
 
Avatar do usuário
ADMIN
ADMIN
Mensagens: 17639
Nome: Kleber
Descrição do site: Onde você encontra scripts grátis para o seu site
Sexo: Masculino
Localização: RJ / RJ / Brasil
Contato:

SQL AVANCADO - Duvida sobre consulta

24-02-2012 12:00

Seria uma consulta principal que buscaria os usuários, e outra via função que carregaria os dados do usuário específico na listagem. Fazer isso com uma query só pode ser até possível, mas realmente não sei como. Quando preciso fazer algo parecido uso o modo que indiquei.
0
A melhor hospedagem para o seu site HostGator!

Quem está online

Usuários navegando neste fórum: Bing [Bot]