PHP / SQL - 获取另一列的总和

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP / SQL - 获取另一列的总和相关的知识,希望对你有一定的参考价值。

我的mysql数据库中有两个表。一个叫做球员,另一个叫做世界。每个玩家都有一个“级别”和一个“世界”列。我想要实现的是根据表格播放器的列值填充表格世界中的列。我想首先得到那个世界的球员总数以及他们的平均水平。

我的表看起来像这样:

表:球员

+-------+-------+--------+----------+-------+--------------+---------+--------+
|  id   | name  |  sex   | vocation | level | achievements |  world  | online |
+-------+-------+--------+----------+-------+--------------+---------+--------+
| 24471 | John  | Male   | None     |    92 |            3 | Antica  |      1 |
| 24493 | Bob   | Male   | None     |    76 |           19 | Amera   |      0 |
| 24535 | Sam   | Male   | None     |    75 |            0 | Antica  |      0 |
| 24574 | Sarah | Female | None     |    78 |           23 | Beneva  |      1 |
| 24673 | Carl  | Male   | None     |    75 |           10 | Belobra |      1 |
+-------+-------+--------+----------+-------+--------------+---------+--------+

表:世界

+----+---------+---------+--------+--------+----------+---------------+--------------+
| id |  name   | players | online | avglvl | totalexp |   location    |     pvp      |
+----+---------+---------+--------+--------+----------+---------------+--------------+
|  1 | Amera   |       0 |      0 |      0 |        0 | North America | Open PvP     |
|  2 | Antica  |       0 |      0 |      0 |        0 | Europe        | Open PvP     |
|  3 | Astera  |       0 |      0 |      0 |        0 | North America | Optional PvP |
|  4 | Belobra |       0 |      0 |      0 |        0 | South America | Optional PvP |
|  5 | Beneva  |       0 |      0 |      0 |        0 | Europe        | Optional PvP |
+----+---------+---------+--------+--------+----------+---------------+--------------+

例如,我们可以看到球员约翰和萨姆拥有世界的安提卡。因此,Antica在表格世界中的播放器列下应该具有值“2”。但只有John在Antica上线。因此,世界Antica在“world”表中的“online”列下应该具有值“1”。等等。我也想要他们在那个世界的平均水平。

如何通过SQL查询来实现这一点?

首先,我需要获得所有世界名称(我认为?)并循环遍历它们。然后获取每个世界的以下详细信息:

  • 玩家数量
  • 在线金额
  • 平均水平金额

然后使用这些值更新到worlds表中。

答案

您可以将数据汇总为:

select world, count(*) as players, sum(online) as online, avg(level) as avglevel
from players
group by world;

你可以把它加入到update中:

update worlds w join
       (select world, count(*) as players, sum(online) as online, avg(level) as avglevel
        from players
        group by world
       ) p
       on w.world = p.world
    set w.players = p.player,
        w.online = p.online,
        w.avglevel = p.avglevel;

我不认为像这样保持一个单独的表是一个好主意。毕竟,您可以随时查询players以获取此信息。这两个系统也很快就会过时,因此数据不一致。您可以通过使用触发器来解决这个问题,但这会增加系统的复杂性。通常,简单的查询就足够了。

以上是关于PHP / SQL - 获取另一列的总和的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB/mysql SQL查询问题:我想根据另一列的组值对一列进行部分总和

基于 DataFrame 中另一列的列的滚动总和

熊猫:设置列等于另一列的分组总和[重复]

按一列分组并在熊猫中找到另一列的总和和最大值

连接表SQL PHP中列的总和不起作用[重复]

具有 1 个不同的列和来自另一列的总和值 [关闭]