Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fmda

sistema de ranking

Recommended Posts

Olá,

 

Estou com uma duvida e não estou sabendo aplicar, poderia me ajudar? Seguinte:

 

Semanalmente eu tenho que ler alguns xml e jogar estes valores no banco de dados. Nele está contido o Nome e Valor. Na proxima semana faço a mesma coisa leio o xml e armazeno o Nome e Valor (neste caso pode houver alguns usuarios a mais, ou seja, na primeira semana tem 100 usuarios nesta outra semana terá 120 usuarios (que são os 100 anterior e mais 20 novos)

 

Aqui vem a duvida, eu preciso jogar estes dados numa tabela de ranking, onde me retorna a posição, primeiro, segundo lugares e por aí vai.

 

Como faço pra quando eu ler esta segunda semana ele comparar o valor e me dizer: "Olha semana passada vc tava no 5º lugar, porém hoje você tá no 10º lugar)

 

 

Minha tabela de rank

 

CREATE TABLE IF NOT EXISTS `rank` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) COLLATE latin1_general_ci NOT NULL,
`valor` int(10) NOT NULL
PRIMARY KEY (`id`)
)

 

 

Valores da primeira semana

 

INSERT INTO `ranki` (`id`, `nome`, `valor`) VALUES
(1, 'Nome 1', 5),
(2, 'Nome 2', 100),
(3, 'Nome 3', 150),

 

 

Valores da segunda semana

 

 

 

INSERT INTO `ranki` (`id`, `nome`, `valor`) VALUES
(1, 'Nome 1', 10),
(2, 'Nome 2', 100),
(3, 'Nome 3', 200),
(4, 'Nome 4', 50),
(5, 'Nome 5', 100),

 

 

Qual forma mais facil, eu estava pensando seguinte: fazer duas tabelas rank 1 e rank 2 mas como fazer a comparação (meu referencial é o nome, se o nome for igual é sinal que são os mesmos usuarios

 

Jogar os valores do rank 1 ja fiz, mas queria por uma segunda coluna e nela mostrar os valores de "+" se ele subiu o ranking, "-" se ele caiu no rank e "o" se ele é novo e nao estava no rank

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao entendi, eu preciraria comparar pra mostrar se subiu ou desceu no rank. Na pagina mostraria o valor da ultina leitura. E do lado o simbolo de subiu ou desceu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, se vai ser sempre de uma semana pra outra, é melhor vc usar duas colunas na sua tabela:

 

-- TABELA
ID
NOME
VALOR_ANTERIOR
VALOR_ATUAL

 

 

Quando vc tiver valores novos vc vai dar UPDATE ao invés de INSERT.

 

UPDATE tabela SET valor_anterior = valor_atual, valor_atual = {novo_valor} WHERE nome = '{nome}'

 

Daí vc vai comparar na hora de puxar os dados:

 

SELECT nome,

CASE WHEN valor_atual > valor_anterior THEN CONCAT('+', valor_atual)
WHEN valor_atual < valor_anterior THEN CONCAT('-', valor_atual)
ELSE valor_atual END AS valor 

FROM tabela
ORDER BY valor_atual DESC

 

Abs!

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas se eu der update ele vai subtituir os valores e não vai comparar ou entendi errado

a não ser que crio um atributo com valor '1' quando for ler novos dados dou insert porem agora com valor '2' e faço comparação assim

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se vc quer comparar só o atual e o da semana anterior, é só fazer como falei acima.

 

Dei exemplo do UPDATE, da tabela e da consulta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ahh entendi,

vou tentar aqui e te falo

 

 

eu acho que sera mais dificil do que imagina, porque terei problemas em adicionar o valor para o mesmo usuario. pois esta semana o usuario 1 tem valor x, na proxima leitura como vou confrontar o mesmo usuario 1 e por o novo valor naquela linha da tabela

 

 

 

eu alimento estes valores com insert normal.

 

fazendo via codigo sera que fica mais facil eu controlar isso? criaria 2 tabelas rank 1 e rank 2 e cercava via codigo com o nome talvez

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não deu pra te entender amigo.

 

Vc não vai adicionar valor pro mesmo usuário, apenas na primeira vez. Depois é apenas UPDATE, fazendo o valor atual ir para valor antigo e atualizando o valor atual com o que veio do XML. Daí vc compara esses dois campos.

 

Por que isso não te resolveria?

 

Entre duas tabelas vai ficar bem mais complexo, vc vai ter que ficar definindo se é a tabela 1 ou a 2 que tem os valores atuais, ou simplesmente sempre passar os valores de uma tabela pra outra quando for atualizar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

nem sempre sera os mesmos usuarios, pode ser que na leitura 2 tenha novos usuarios (nunca menos, mas sempre a mais)

outra duvida é quanto a ordenação, nem sempre os usuarios serao incluidos em ordem o usuario X pode pegar a ID 10 na segunda leitura este ID pode ser 20

 

aí me complicada todo quando a questão de: Usuario x subiu 10 posições.

 

talvez ainda não vi de forma clara ainda estas questões, talvez esteja vendo chifre na cabeca de cavalo, hehe

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que entendi vc valida pelo nome.

Ou seja, vc não precisa de um ID.

 

Vc deveria usar na verdade o "nome" como PRIMARY KEY e fazer um

INSERT … ON DUPLICATE KEY UPDATE

 

Att,

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.