Tenho duas tabelas, uma contendo enquetes e outra contendo votos de enquetes, assim (simplificada):
CREATE TABLE IF NOT EXISTS polls (
id SERIAL PRIMARY KEY,
token VARCHAR(20)
);
CREATE TABLE IF NOT EXISTS poll_votes (
id SERIAL PRIMARY KEY,
account VARCHAR(255) NOT NULL,
poll_id INT NOT NULL,
token_one BIGINT,
token_two BIGINT,
token_three BIGINT
[etc.]
);
Há um número crescente de colunas de tokens na poll_votes
tabela, podendo haver mais de mil delas. Existem várias poll_votes
linhas para cada poll
linha e preciso calcular quantos tokens no total estão votando em cada enquete. A polls.token
coluna contém o nome da coluna do token a ser utilizada, ou seja, especifica qual token deve ser utilizado para contar os resultados daquela enquete específica.
Portanto, tenho uma consulta como esta para calcular os resultados quando há, digamos, apenas uma coluna de token:
SELECT p.token,
(
SELECT SUM(token_one)
FROM poll_votes pv
WHERE p.id = pv.poll_id
GROUP BY pv.poll_id
) AS total_token_one
FROM polls p;
No entanto, isso codifica a token_one
coluna. Considerando que eu preciso que ele seja definido dinamicamente com base no valor que existe na token
coluna da polls
tabela. Como eu posso fazer isso?
Atualizar:
Eu criei essa estrutura de tabela (mesmo que ela crie desafios) porque há um número grande e continuamente crescente de tokens. Se houver uma linha separada poll_votes
para cada token, cada voto poderá exigir a inserção de centenas de linhas (já que cada conta pode ter centenas de saldos de token). Portanto, para um grande número de contas de votação, torna-se um grande número de linhas.
Por que não mudar a estrutura das tabelas? Parece-me que você deve remover todas as colunas token_someNumber da tabela poll_votes e criar outra tabela que faça a ligação entre o voto e o token relevante
Adi
Não há como usar um valor de coluna como identificador em uma consulta de forma dinâmica.
Este pode ser o caso do JSON no banco de dados. Defina
poll_votes
assim:);
A
tokens
coluna poderia ficar assim:A consulta pode ser semelhante a:
Obrigado a todos pela sua ajuda. Enquanto eu estava escrevendo uma atualização para a pergunta (agora atualizada) para explicar mais sobre o motivo da escolha dessa estrutura de tabela, ocorreu-me uma abordagem alternativa. Eu poderia ter uma única
poll_votes.token
coluna e inserir dinamicamente o valor nela para qualquer token que esteja napolls.token
coluna. (Na realidade, as duas colunas nas duas tabelas têm nomes ligeiramente diferentes, e não iguais.)Desta forma posso manter a disposição de uma linha para cada voto na enquete. Todos os outros saldos simbólicos de uma conta não são registrados na votação eleitoral, mas na verdade não são necessários.
Parece um pouco pouco intuitivo/estranho ter um nome de coluna genérico que pode conter saldos para tokens diferentes, mas acho que funciona, pois é fácil encontrar exatamente qual token está armazenado. Parece estar funcionando bem.