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

时间:2017-12-28 18:06:19

标签: php mysql sql sum

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

我的表格如下:

表:玩家

+-------+-------+--------+----------+-------+--------------+---------+--------+
|  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 |
+----+---------+---------+--------+--------+----------+---------------+--------------+

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

如何通过SQL查询来实现PHP?

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

  • 玩家金额

  • 在线金额

  • 平均等级金额

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

1 个答案:

答案 0 :(得分:1)

您可以将数据汇总为:

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即可获取此信息。这两个系统也很快就会过时,因此数据不一致。您可以通过使用触发器来解决这个问题,但这会增加系统的复杂性。一般来说,简单的查询就足够了。