【问题标题】:User points from different tables来自不同表的用户点
【发布时间】: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 中。

那么有什么方法可以从我所拥有的结构的表格中获取我需要的信息吗?

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    您缺少 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
    

    【讨论】:

    • 谢谢,您的(第一个代码)解决方案非常有帮助。我对其进行了一些更改,以将第二个 PointCount 计算为 SUM(T2.EventInfo)+T1.Points 并将顺序更改为 DESC,它按预期工作。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多