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

标签 php mysql sql sum

我的 MySQL 数据库中有两个表。一个表称为玩家,另一个表称为世界。每个玩家都有一个“等级”和一个“世界”栏。我想要实现的是根据表玩家中的列值填充表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 |
+----+---------+---------+--------+--------+----------+---------------+--------------+

例如,我们可以看到玩家JohnSam拥有世界Antica。因此,Antica 在桌面世界中的玩家栏下应该具有值“2”。但只有约翰在 Antica 上在线。因此,世界 Antica 在表“world”中的“online”列下应具有值“1”。等等。我还想要他们在那个世界的平均水平。

如何通过 PHP 进行 SQL 查询来实现此目的?

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

  • 玩家数量

  • 在线金额

  • 平均等级金额

然后用这些值更新世界表..

最佳答案

您可以将数据总结为:

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

您可以将其合并到更新中:

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 - 获取另一列的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48012262/

相关文章:

php - 在 PHP 中显示带序号后缀的数字

php - 简单的 PHP 表单 SQL 插入

php - 如何显示多对多 PHP/SQL 关系中的特定行/列?

php - 按字符串的一部分对数据库进行排序?

java - Gwt 和 php rpc

php - Laravel Nova 不坚持新模型

mysql - 如何更改表以将列从 UNIQUE 更改为 NOT UNIQUE?

mysql - MYSQL 中 IF 语句中的 SET WHERE

php - 已弃用 : Required parameter $to_addr follows optional

php - 从 Codeigniter 备份恢复数据库