Sql com group by

11 respostas
R

SELECT g.gam_id, g.gam_titulo, r.rnk_pontos, r.rnk_nome
FROM games g, ranking r
WHERE r.gam_id = g.gam_id
group by g.gam_id
HAVING r.rnk_pontos &gt= MAX(r.rnk_pontos)

Pessoal, teoricamente este select deveria estar funcionando, mas acontece que ele não retorna todos os registros necessários.

tenho uma tabela de GAMES
gam_id
gam_titulo

e uma de RANKING
rnk_nome
rnk_pontos

Precisava saber a maior pontuação de cada jogo.

Alguém sabe me dizer o que está acontecendo?

11 Respostas

C

SELECT g.gam_id, g.gam_titulo, r.rnk_pontos, r.rnk_nome FROM games g, ranking r WHERE r.gam_id = g.gam_id group by g.gam_id, g.gam_titulo, r.rnk_pontos, r.rnk_nome HAVING r.rnk_pontos >= MAX(r.rnk_pontos)

Veja se assim você consegue visualizar seu resultado.

R

também não
assim ele não retorna só a maior pontuação, assim ele retorna todos, pois agrupa os outros campos também e em cada um o MAX(r.rnk_pontos) fica o próprio r.rnk_pontos

boaglio

Renatho:
SELECT g.gam_id, g.gam_titulo, r.rnk_pontos, r.rnk_nome
FROM games g, ranking r
WHERE r.gam_id = g.gam_id
group by g.gam_id
HAVING r.rnk_pontos &gt= MAX(r.rnk_pontos)

Pessoal, teoricamente este select deveria estar funcionando, mas acontece que ele não retorna todos os registros necessários.

tenho uma tabela de GAMES
gam_id
gam_titulo

e uma de RANKING
rnk_nome
rnk_pontos

Precisava saber a maior pontuação de cada jogo.

Alguém sabe me dizer o que está acontecendo?

Impossível esse SELECT funcionar, o agrupamento está errado.

Acho que o que vc quer é isso:

SELECT g.gam_id, g.gam_titulo, MAX(r.rnk_pontos)
FROM games g, ranking r
WHERE r.gam_id = g.gam_id
group by g.gam_id, g.gam_titulo
R

Quase isso, eu preciso também o nome do cara que fez a pontuação “r.rnk_nome”, se eu colocar ai ele retorna o nome de outro cara, por isso que ao inves de usar o MAX(r.rnk_pontos) no select usei o r.rnk_pontos

boaglio

Ah, ok, então o q vc precisa é isso:

SELECT g.gam_id, g.gam_titulo, r.rnk_nome ,r.rnk_pontos
 FROM games g, ranking r
 WHERE r.gam_id = g.gam_id
  AND r.rnk_pontos IN (select MAX(r.rnk_pontos) 
                                  FROM ranking r2
                                  WHERE r2.gam_id = g.gam_id )
Roger75

No caso você poderia ter duas pessoas com a mesma pontuação para o mesmo jogo, por isso o nome não está sendo retornado.

Faça um select com subselect:

select sub1.tit1, sub1.pont1, sub2.nome from 
            (select g.gam_titulo tit1, max(r.pontos) pont1 
             from games g, ranking r 
             where g.gam_id=r.gam_id 
             group by g.gam_id) sub1, 
             ranking sub2 
             where sub1.pont1=sub2.pontos 
             order by sub1.tit1,sub1.pont1;
R

esta forma não funciona no mysql

Roger75

Qual sua versão do MySQL? No MySQL 5 funciona.

R

o servidor q vou precisar usar esse select tem a versão 4 =\

boaglio

Desde a versão 4 do MySQL que existe o suporte a subqueries, veja esse exemplo.

O exemplo que eu mandei não funcionou?

R

IN e NOT IN funciona, não funciona o

select * from (
select * from tabela
)

isso acho que funciona só no oracle

Criado 30 de abril de 2007
Ultima resposta 30 de abr. de 2007
Respostas 11
Participantes 4