【发布时间】:2016-03-21 17:55:00
【问题描述】:
我发现了一个我自己无法解决的问题。
我在表 AE_Users 中有用户,我在其中存储了他们的特殊积分 另外,我有 AE_Event 表,我在其中存储用户可以加入的事件,并且对于这些事件,我以秒为单位存储播放时间(时间戳),由 CRON 脚本检查服务器上的播放器来处理。 还有一个名为 AE_EventJoin 的表,用户加入其中一个事件时存储在其中(因此可以有一个用户加入多个事件 ID 的多条记录)
我可以通过在 PHP 脚本中使用 3 个 SQL 来计算一个用户的点数:
SELECT `SteamID` FROM AE_Users WHERE `SteamID` = $SteamID
SELECT SUM(`EventInfo`) FROM AE_Events WHERE ID IN (SELECT `EventID` FROM AE_EventJoin WHERE `JoinType` = 1 AND `SteamID` = '$SteamID')
SELECT `Points` FROM AE_Users WHERE `SteamID` = $SteamID
但现在我需要获得积分最多的前 5 名用户,我真的无法解决如何查询数据库以将它们提供给我。
我不想查询所有用户的数据库,然后用 PHP 对它们进行排序,那太难看了。
我相信有一种方法可以通过单个 SQL 查询计算用户积分。我尝试自己构建它,但它没有按预期工作。我能够想出这个:
SELECT T1.`SteamID`, T1.`Points` AS PointCount, SUM(T2.`EventInfo`) AS PointCount FROM AE_Users T1, AE_Events T2 WHERE T2.ID IN (SELECT `EventID` FROM AE_EventJoin WHERE `JoinType` = 1 AND `SteamID` = T1.`SteamID`) ORDER BY PointCount LIMIT 5
返回这个:phpMyAdmin result
这是错误的。它只返回一个用户,第一个 PointCount 是用户的特殊点数,这是正确的,但第二个 PointCount 是完全错误的。图片 phpMyAdmin Event points
我想将这两个变量合并到一个 PointCount 中,但由于某些错误,GROUP BY 命令不允许我这样做。不过这不是什么大问题,我可以很容易地将它们合并到 PHP 中。
那么有什么方法可以从我所拥有的结构的表格中获取我需要的信息吗?
【问题讨论】: