我发现了一个我自己无法解决的问题。
我在表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
但是现在我需要获得大多数积分的前五名用户,而且我真的无法解决如何查询数据库给我的问题。
我不想为所有用户查询数据库,然后在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
那是错的。它只返回一个用户,第一个PointCount是用户的特殊点数,这是正确的,但第二个PointCount是完全错误的。图片 phpMyAdmin Event points
我想将这两个变量合并到一个PointCount中,但GROUP BY命令不允许我这样做,因为有些错误。这不是一个大问题,我可以轻松地将它们合并到PHP中。
那么有什么办法可以从像我这样的结构表中获取所需的信息吗?
答案 0 :(得分:0)
您缺少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
此外,您使用了隐式(逗号分隔)连接语法,请尽量避免这种情况,并使用正确的语法连接,就像在我的解决方案中一样。
你没有张贴你的桌面结构,因此很难猜出你究竟需要什么,但它与此类似。
此查询也可以使用连接而不是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