Query vencedora! Alguém pode me ajudar?

8 respostas
L

Oi Pessoal,
Estou querendo uma query simples mas como não tenho mt experiência não sei como fazer!

Digamos que eu tenha a seguinte tabela de log, de acordo com as visitas dos usuarios as páginas no site:

Log +-----------+-------------+------------+-----------+ | Login | Data | Estilo | Acao | +-----------+-------------+------------+-----------+ | leo182 | 20060721 | Punk-Rock | ouvir | | pedro44 | 20060722 | Pop-Rock | visitar | | joao_op | 20060722 | Hardcore | visitar | | pedro44 | 20060722 | Pop-Rock | ouvir | | pedro44 | 20060722 | Pop-Rock | comprar | | leo182 | 20060721 | Punk-Rock | ouvir | | pedro44 | 20060801 | DeathMetal | ouvir | | pedro44 | 20060801 | Pop-Rock | ouvir | | pedro44 | 20060801 | Reggae | visitar | +-----------+-------------+------------+-----------+
Notamos que o Estilo favorito do usuário “pedro44” é o “pop-rock”.
O que eu gostaria é de uma query que retonasse essatamente isso!
A partir do Login do usuário quero descobrir o Estilo que ele mais interage no site, e com isso eu possa futuramente recomendar a ele outras músicas do mesmo estilo!
Bem, imagino que deve ser algo usando count(*), mas não tenho ideia!

Alguém saberia me dizer?
:?

8 Respostas

amilhoranza

A query seria mais ou menos assim

Select count(*) as tot, Estilo From Log where Login = 'pedro44' Group By Estilo Order By tot Desc Limit 1

Isso te retornará apenas uma linha com o estilo favorito do pedro44.
Obs.: Claro que alguns comandos serão diferentes em determinados SGDBS. Mas como no seu caso me parece que você usa mysql, creio que a query acima vai funcionar corretamente.

dudaskank

para que retorne apenas o primeiro mesmo, pode colocar um “LIMIT 1” ao final dessa query mesmo

flw

[edit] poxa, editou não vale, meu post perdeu o sentido hehehehe

amilhoranza

Foi mal,
É que quando editei ninguém havia respondido ainda heeheh

L

Valeu pela ajuda pessoal!!! Deu certo!!!
:smiley:
Bem, agora só preciso de mais uma coisa, mas acho que isso não consigo com um simples SELECT.
Já descobri que o pedro prefere “Pop-Rock” certo?
Agora eu queria recomendar a ele outras bandas que são do mesmo estilo, menos a banda favorita dele que vamos supor que seja “Tihuana”.
Então tomando por base a tabela abaixo, sei que eu poderia fazer uma Query assim:

SELECT * FROM bandas WHERE estilo = ‘Pop-Rock’ AND nomebanda != ‘Tihuana’

bandas +-----------------+--------------+ | nomebanda | estilo | +-----------------+--------------+ | Dead Fish | Hardcore | | CPM 22 | Hardcore | | Raimundos | Hardcore | | Detonautas | Pop-Rock | | Pitty | Pop-Rock | | Tihuana | Pop-Rock | | Charlie Brown | Pop-Rock | | Ultraje a Rigor | Pop-Rock | | O Rappa | Reggae-Rock | | Sepultura | DeathMetal | +-----------------+--------------+
Essa Query retornaria: Detonautas, Pitty, Charlie Brown e Ultraje a Rigor!

Mas dessas que retornaram eu só quero selecionar duas! Sendo de forma randomica… pensei em usar essa função:

Random r = new Random(); int randInt = Math.abs(r.nextInt()) % 5;
E assim gerar um numero que seria o numero da linha que eu pego nessa tabela de resultado…
Mas no futuro terão outras bandas cadastradas e esse sorteio não pode se basear em um numero fixo!
Será que existe um SELECT ou uma maneira mais prática de fazer isso? :? :?:

dudaskank

Para saber o nº de bandas disponíveis, vc pode usar:

SELECT count(*) FROM bandas WHERE estilo = 'Pop-Rock' AND nomebanda != 'Tihuana'

Pegando a contagem no resultset, vc coloca ela no lugar daquele 5 ali. Com os dois números escolhidos, aí é só rodar mais 2 queries, mais ou menos assim:

SELECT * FROM bandas WHERE estilo = 'Pop-Rock' AND nomebanda != 'Tihuana' LIMIT oSeuNumeroAleatorio, 1

Atenção! Não testei pra ver se funciona…

L

Valeu Eduardo!!!

Eu consegui com essa Query aqui:

SELECT nomebanda FROM bandas WHERE estilo = 'Pop-Rock' AND nomebanda != 'Tihuana' ORDER BY RAND() LIMIT 2

Agora sim está como eu queria!!! :smiley:

Valeu pela força pessoal!!! O GUJ detona mesmo!!! rsrsrs…

.

dudaskank

Beleza.

Bom, sem querer ser chato mas já sendo, usando essa sua tabela ali, viriam sempre os mesmos dois primeiros não viria?

Imagine se ele foi inserido em ordem alfabética e já vem nessa ordem do bd, ordenando ou não por qualquer uma das duas colunas eles não vem na mesma ordem sempre?

ex:

bandas +-----------------+--------------+ | nomebanda | estilo | +-----------------+--------------+ | Charlie Brown | Pop-Rock | | Detonautas | Pop-Rock | | Pitty | Pop-Rock | | Tihuana | Pop-Rock | | Ultraje a Rigor | Pop-Rock | +-----------------+--------------+

Se num select sem ordenar ele vier já assim, ordenando pela coluna 1 ou 2 da na mesma não dá? Ou eu que to viajando???

flw

L

É, acho que sim… se o BD for alimentado em ordem alfabética tanto faz a coluna que mandar ordenar…
Mas no meu caso nem rola… pq meu BD será alimentado sem levar em consideração a ordem alfabética… e também tenho outros campos na tabela… é que nesse exemplo, coloquei apenas “nomebanda” e “estilo” pra não me enrolar muito na explicação do que eu queria fazer sacou? :wink:

.

Criado 1 de agosto de 2006
Ultima resposta 1 de ago. de 2006
Respostas 8
Participantes 3