php - 来自不同表的用户积分

标签 php mysql sql

我发现了一个我自己无法解决的问题。

我在表 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 中。

那么有什么方法可以从具有像我这样的结构的表中获取我需要的信息吗?

最佳答案

你缺少一个 group by 子句,所以试试这个:

SELECT T1.`SteamID`, max(T1.`Points`) AS PointCount, SUM(T2.`EventInfo`) AS PointCount
FROM AE_Users T1
INNER JOIN AE_Events T2
 ON T2.ID IN (SELECT `EventID` FROM AE_EventJoin
              WHERE `JoinType` = 1
                AND `SteamID` = T1.`SteamID`)
GROUP BY T1.`SteamID`
ORDER BY PointCount 
LIMIT 5

此外,您使用了隐式(逗号分隔)连接语法,请尽量避免这种情况并使用正确的显式连接语法,就像在我的解决方案中一样。

您没有发布您的表结构,因此很难猜测您到底需要什么,但它与此类似。

这个查询也可以用 join 而不是 IN() 来写

SELECT T1.`SteamID`, max(T1.`Points`) AS PointCount, SUM(T2.`EventInfo`) AS PointCount
FROM AE_Users T1
INNER JOIN `EventID` T3
 ON(t1.`steamID` = t3.`steamID` and  `JoinType` = 1 AND `SteamID` = T1.`SteamID`)
INNER JOIN AE_Events T2
 ON (T2.ID = T3.ID) 
GROUP BY T1.`SteamID`
ORDER BY PointCount 
LIMIT 5

关于php - 来自不同表的用户积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36127660/

相关文章:

mysql 在 linestring mbrcontains 中使用 lat long 列

sql - 如何将文件路径或URL放入数据库?

sql - 哪些类型的情况适契约(Contract)时使用关系数据库和NoSQL数据库?

sql - 为什么 Sql 条件(不是 in ,not like ,!=)不能处理表的 varchar 值

php - 压缩多个文件,其地址存储在 mysql 表中

php - 更新数据时出现禁止错误

php - sqldatabse 不接受非英文字符

php - 电子商务网站服务器性能缓慢

php - 如何在 yii 框架上将 blob 编码为 base64 字符串?

php - 在 Blade 模板中将数字格式设置为 K/M/B