Ajuda com consulta para montar um ranking

MySQL

23/02/2016

Estou com esse problema,eu tenho que fazer um ranking com a classificação por pontuação e caso haja empate, por data e hora em que a pontuação foi inserida sendo a pontuação mais recente dada como maior.

select * from (
(SELECT distinct nome_jogador,pontos,datahora, 1 as ordem
from jogador j inner join pontuacao_fx p
on j.id_jogador = p.id_jogador WHERE pontos > (SELECT pontos FROM pontuacao_fx WHERE id_jogador=7 )
ORDER BY datahora desc, pontos desc)

union

(select distinct nome_jogador, pontos,datahora, 2 as ordem
from jogador j inner join pontuacao_fx p
on j.id_jogador = p.id_jogador where pontos = (SELECT pontos FROM pontuacao_fx WHERE id_jogador=7 )
)

union

(SELECT distinct nome_jogador,pontos,datahora, 3 as ordem
from jogador j inner join pontuacao_fx p
on j.id_jogador = p.id_jogador WHERE pontos < (SELECT pontos FROM pontuacao_fx WHERE id_jogador=7 )
ORDER BY datahora desc, pontos desc);

) order by ordem asc,datahora desc, pontos desc

Estou de MYSQL gratuito com workbench e o erro é esse:


ERROR CODE:1248: EVERY DERIVED TABLE MUST HAVE ITS OWN ALIAS.


Peço encarecidamente socorro.
Luís Oliveira

Luís Oliveira

Curtidas 0

Mais Respostas

Marcos P

Marcos P

23/02/2016

O problema deve estar ocorrendo por conta do ORDER BY que é genérico.

Tente o seguinte : em cada uma das queries use ALIAS especifico ( j1, p1, j2, p2,... ) e retire todos os ORDER BY ( só pra testar ).

Se funcionar, tente colocar o ORDER BY somente na clausula mais externa ( select * from... ).
GOSTEI 1
Ramon

Ramon

23/02/2016

Boa tarde amigao.

vc deve fazer um schema novo com as procedures de comparações para que vc consiga compilar o banco de forma corrente.

Veja as alterações que fiz, estão funcionando bacana:

select * from (
(SELECT distinct nome_jogador,pontos,datahora, 1 as ordem
from jogador j inner join pontuacao_fx p
on j.id_jogador = p.id_jogador WHERE pontos > (SELECT pontos FROM pontuacao_fx WHERE id_jogador=7 )
ORDER BY datahora desc, pontos desc)

union

(select distinct nome_jogador, pontos,datahora, 2 as ordem
from jogador j inner join pontuacao_fx p
on j.id_jogador = p.id_jogador where pontos = (SELECT pontos FROM pontuacao_fx WHERE id_jogador=7 )
)

union

(SELECT distinct nome_jogador,pontos,datahora, 3 as ordem
from jogador j inner join pontuacao_fx p
on j.id_jogador = p.id_jogador WHERE pontos < (SELECT pontos FROM pontuacao_fx WHERE id_jogador=7 )
ORDER BY datahora desc, pontos desc);

) order by ordem asc,datahora desc, pontos desc

Qualquer dúvida entre em contato.

Att,
DBA Senior.
GOSTEI 0
POSTAR