我有两个表格,一个包含民意调查,另一个包含民意调查投票,如下所示(简化):
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.]
);
表中的 token 列数量越来越多poll_votes
,可能有一千多个。poll_votes
每poll
行都有多行,我需要计算总共有多少 token 为每项民意调查投票。polls.token
列具有要使用的 token 列的名称,即它指定应使用哪个 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;
但是,这会对列进行硬编码。而我需要根据表列token_one
中的值动态设置它。我该怎么做?token
polls
更新:
我想出了这个表结构(尽管它带来了挑战),因为代币数量庞大且不断增长。如果poll_votes
每个代币都有单独的行,那么每次投票都可能需要插入数百行(因为每个账户可以有数百个代币余额)。因此,对于大量投票账户来说,行数将变得非常庞大。
为什么不改变表结构?在我看来,你应该从 poll_votes 表中删除所有 token_someNumber 列,并创建另一个表,将投票与相关 token 链接起来
阿迪
无法以动态方式在查询中使用列值作为标识符。
这可能是数据库中 JSON 的一个情况。定义
poll_votes
如下:(英文):
该
tokens
列可能如下所示:查询可能如下所示:
感谢大家的帮助。当我在写问题的更新(现已更新)以进一步解释选择此表结构的原因时,我想到了一种替代方法。我可以有一个
poll_votes.token
列,并动态地将列中的任何标记的值插入其中polls.token
。(实际上,两个表中的两列名称略有不同,而不是相同。)这样我就可以保持每张投票一行的排列。账户的所有其他代币余额都不会记录在投票中,但实际上它们也没有必要。
用一个通用的列名来保存不同代币的余额感觉有点不直观/奇怪,但我猜它可以完成工作,因为人们可以轻松找到存储的具体代币。它似乎运行良好。