来自不同表

时间:2016-03-21 09:49:42

标签: 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

但是现在我需要获得大多数积分的前五名用户,而且我真的无法解决如何查询数据库给我的问题。

我不想为所有用户查询数据库,然后在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中。

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

1 个答案:

答案 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