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