Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal!
eu tenho as seguintes tabelas: pontos|galleries
pontos:
id_gallery|data
galleries:
id|title
fiz esse script que mostra o total de pontos
$ranking = "SELECT m.title, COUNT(*)as ranking FROM pontos p INNER JOIN galleries m ON p.id_gallery=m.id GROUP BY (p.id_gallery) ORDER BY ranking DESC";
$query = mysql_query($ranking)or die(mysql_error());
$i = 1;
while($row = mysql_fetch_array($query))
{
echo $i.'º - ';
echo $row['title'].' - ';
echo $row['ranking'].'pts<br />';
$i++;
}
mas eu queria colocar o rank na single, ou seja fazer uma busca pelo id da galeria e pegar rank.
tentei de várias formas, mas não conseguir achar a lógica certa
desde já agradeço muito
nestante eu vou tentar fazer isso, agora eu vou ter que sair aqui :)
fiz um SQL que faz exatamente oque me disse, só que acusa o erro:
Unknown column 'points' in 'where clause'
tentei resolver só que não consegui sozinho U.U
esse é o código SQL que estou usando:
$pontos = $row['ranking'];
"SELECT *, COUNT(p.id_gallery)as points FROM galleries m INNER JOIN pontos p ON m.id=p.id_gallery WHERE points > '$pontos' GROUP BY (p.id_gallery) ORDER BY points DESC";
obs: quando tiro o WHERE ela retorna todos os resultados encontrados, e não isso que eu quero
Nao entendi bem o problema mas nao seria o caso de HAVING ?!
http://dev.mysql.com/doc/refman/5.1/en/group-by-extensions.html
o problema é o seguinte,
eu fiz como o Vinicius Rangel, sugeriu ali em cima, só que quando eu tento colocar o WHERE pra selecionar apenas as colunas que tiverem pontos maior o $pontos (ou seja básicamente a classificassão na tabela) ele dar error
acho que é porque, a coluna points não existe realmente. mas será que tem como contornar?
estou usando o "COUNT(p.id_gallery)as points" para contar quantos pontos cada galeria tem
simplificado: preciso usar o WHERE para selecinar apenas registros, quais os points(gênerica) forem maior que $pontos
mas eu queria colocar o rank na single
não entendo o que seria isto ...
to brisando aqui
nem isto
Culpa minha, mas vamos lá , esta quey abaixo acha os p.id_gallery que tenham 5 ou mais pontos (ocorrências na tabela pontos), 5 poderia ser um paramêtro.
SELECT p.id_gallery, COUNT(p.id_gallery) as points
FROM galleries m INNER JOIN pontos p ON m.id=p.id_gallery
GROUP BY (p.id_gallery)
HAVING COUNT(p.id_gallery) > 5 --aqui pode ser um parametro.
ORDER BY 2 DESC
ou seja fazer uma busca pelo id da galeria e pegar rank.
Por isto entendo
SELECT COUNT(p.id_gallery) as points
FROM galleries m INNER JOIN pontos p ON m.id=p.id_gallery
WHERE p.id_gallery = 1234
ou seja, os pontos da p.id_gallery 1234
Espero ter ajudado.
não deu certo aqui. então acho que vou criar outra tabela pra armazenar a posição do rank
obrigrado por tentar me ajudar :)
O que deu de errado ?!
Então motta, o que ele quer é que tipo quando o usuário entrar no perfil aparecer lá.
você esta na posição 43..
e o que disse que tava brisando é que enquanto lia tive essa epifania ai que é meio um gato mas deve funcionar.
Willian, posta seu código pra dar uma olhada.
eu criei um tópico por que estava com dúvidas para trabalhar com colunas criadas a partir de cálculo da consulta e o Motta conseguiu resolver, essa seria sua solução também.
posta o select que você tentou
http://stackoverflow.com/questions/2520357/mysql-get-row-number-on-select
Tente usar a query que gera o ranqueamento (rank), como uma tabela virtual ou view e saber o rank, aqui o itemID 234 seria o numero 4.
desculpe a demora, tive que formatar meu PC pois o mysql parou de funcionar
é o seguinte meu problema não é bem a query pois ela deveria funcionar (na teoria)
só que não existe uma tabela "pts" ( "pts" é um resultado de um COUNT() ), por isso não consegui usa-la no WHERE
WHERE pts > $pontos
então percebi que meu problema está na modelagem mesmo,
eu deveria criar um tabela com "pts"
e contar os pontos lá, ao invés de uma tabela com os registros como pontos
então qual melhor forma de fazer um rank?
1º tabela: ranking (1:1)
id | pontos | colocacao | update
ou
2º tabela: ranking (esse seria 1:N)
id | data
Tentou o ideia do #10 ?
isso seria básicamente um sistema de ranking feito com mysql,
porém eu quero fazer um rank individual, ou seja pegar apenas o rank de um resultado separadamente em relação aos outros
exemplo: Está pagina está em 5º lugar
exemplo2: Está pagina está em 19 lugar
Ok, pegue a sql que gera o ranking e leia como uma tabela virtual ...
Select *
From ( Select do rank )
Where rank = 5é isso, não tenho uma tabela rank, só uma tabela com onde cada registro vale um ponto
tabela: ranking (esse seria 1:N)
id | data
percebi que dessa forma eu não consigo fazer, então pensei em colocar assim
tabela: ranking (1:1)
id | pontos | colocacao | update(data da ultima atualizaçao)
apenas uma tabela com o total, que ficaria bem mais fácil de manusear
ou então assim:
tabela pontos: (1:N)
id | data | usuario | ip
tabela ranking (onde vai contar o total dos pontos da tabela anterior) (1:1)
id | pontos | colocacao
ou seja duas tabelas, uma com os pontos separados e outra com o total para fazer o ranking
oque você acha?
caso a #2:
Qual a melhor forma de atualizar esses dados?
exemplo: Crontab (automatico)
exemplo2: A cada consulta
Uma trigger teria de atualizar esta tabela ou uma procedure teria de fazer isto.
Eu faria uma VIEW para saber o ranqueamento.
Obrigado pela ajuda, vou tentar :)
to brisando aqui e pensei numa coisa.
seleciona o usuário, depois ve quantos pontos ele tem, depois busca na tabela todos os resultados onde o nr de ponto é menor ou igual o ponto do usuário e conta quantos registros voltaram.
\o/
isso funciona, falta aplicar