在我们的项目中,我们有一个用户表,其中存储了带有名称和不同类型分数(总分、任务分数等)的用户数据。值的计算方式无关紧要,但将它们分开。
让我们看看下面的表“用户”
id name score_overall score_trade score_quest
1 one 40000 10000 20000
2 two 20000 15000 0
3 three 30000 1000 50000
4 four 80000 60000 3000
为了显示分数,有一个虚拟表和一个表,用于存储用户名、分数和排名的每种分数。所有表看起来都一样,但名称不同。
id name score rank
它们被分开以允许用户搜索和过滤表格。假设有一行玩家“playerX”的排名为 60。因此,如果我过滤“playerX”的分数,我只会看到这一行,但排名为 60。这意味着排名是“硬存储”的,不仅通过行号或类似的东西动态显示。
不同的分数表是通过 cronjob 填充的(并在使用附加的虚拟表的情况下),它执行以下操作:
- 将用户数据复制到虚拟表
- 改变虚拟表
order by score
- 将虚拟表复制到特定的分数表,以便 AI 主键(排名)自动填充正确的值,代表每个用户的排名。
即:有五个具体分数的地方,还有五个分数表和虚拟表,一共是 6 个。
如何优化?
我想做的是优化整个事情并删除重复的表(并尽可能避免使用虚拟表)以将所有分数数据存储在一个具有以下列的表中:
userid, overall_score, overall_rank, trade_score, trade_rank, quest_score, quest_rank
我现在的问题是我如何才能以最好的方式做到这一点,是否有另一种方式如上所示(使用所有不同的表格)?欢迎使用 MYSQL 语句和/或 php 代码。前段时间我尝试使用行号,但这不起作用a)因为它们不能在插入语句中使用,b)因为当过滤每个玩家(如上面示例中的'playerX')时,排名为1这是唯一返回的行。