MySQL的子查询/加入

问题描述:

好,我有一个查询这90%在那里,它只是造就了“未知列a.UserID错误在我读过周围试图排序问题where子句),并发现, SQL进程里面它不会知道我已经设置表A是因为这个问题,但它超出我的知识和专业知识,让它工作。我已经尝试了替代路线JOINs,而是总是回来相同。问题MySQL的子查询/加入

查询是:

SELECT 
    a.*, 
    (SELECT AVG(c.PlayerTime) 
    FROM (
    SELECT PlayerTime 
    FROM elite_highscores b 
    WHERE a.UserID = b.UserID 
    ORDER BY PlayerTime ASC LIMIT 10 
    ) c 
) AS avgtime, 
    MIN(PlayerTime) as besttime, 
    MAX(TimeAdded) as time, 
    COUNT(UserID) 
FROM elite_highscores a 
WHERE Publish = 'Yes' 
GROUP BY UserID HAVING COUNT(UserID) >= 10 
ORDER BY avgtime ASC 

所以基本上我想要做的是选择从高分表中的一些数据(用户谁拥有超过10的高分记录),也计算平均时间(平均时间),但只根据该玩家的最后10个分数,这是什么导致我的问题,一切似乎工作正常。

表结构:

ScoreID int(16) 
UserID int(10) 
PlayerScore int(16) 
Publish enum('No', 'Hidden', 'Expired', 'Yes') 
TimeAdded int(16) 
PlayerIP varchar(18) 
Country varchar(2) 
PlayerTime int(10) 
code varchar(50) 
+0

所有您需要做的仅仅是使用真正的表名,而不是已分配的短名称。 – 2012-01-30 13:31:33

+0

您的'a.UserID = b.UserID'子查询嵌套了两次,因此它不能再使用最外面的作用域作为参考IIRC。 – Naltharial 2012-01-30 13:36:21

+0

安德烈亚斯,哪一部分的查询可以替换? Naltharial是认为这是问题,但它会抛出一个语法错误,如果没有嵌套的方式,我会怎么解决它? – user759542 2012-01-30 13:40:12

SELECT 
    a.UserID, 
    last10.avgtime, 
    MIN(a.PlayerTime) AS besttime, 
    MAX(a.TimeAdded) AS time, 
    COUNT(*) 
FROM 
     elite_highscores a 
    JOIN 
     (SELECT b.UserID, 
       AVG(b.PlayerTime) AS avgtime 
     FROM 
       (SELECT DISTINCT UserID 
       FROM elite_highscores 
      ) da 
      JOIN 
       elite_highscores b 
      ON b.UserID = da.UserID 
      AND b.PlayerTime <= 
       (SELECT c.PlayerTime 
        FROM elite_highscores c 
        WHERE c.UserID = da.UserID 
        ORDER BY c.PlayerTime ASC 
        LIMIT 1 OFFSET 9 
       ) 
     GROUP BY b.UserID 
    ) last10 
    ON last10.UserID = a.UserID 
WHERE a.Publish = 'Yes' 
GROUP BY a.UserID 
ORDER BY avgtime ASC 
+0

非常感谢你,你的先生是一个传奇:) – user759542 2012-01-30 14:21:17

+0

@ user759542:不知道这是你需要什么,虽然(关于细节)。 – 2012-01-30 21:32:22

+0

@ypercube,注意'WHERE UserID = a.UserID'可能不明确。 – danihp 2012-01-30 21:37:28