2012-02-07 53 views
1

我想在过去的n个月中获取独特玩家的前3个分数。当我尝试执行查询,我得到一个错误:mysql中的子查询问题

在“where子句”

下面是我的查询

SELECT * from scores f 
WHERE 
    SC_Id IN (
      SELECT SC_Id FROM (
        SELECT SC_Id from scores where DATE_FORMAT(SC_Date, "%Y%m") = DATE_FORMAT(f.SC_Date, "%Y%m") AND US_Id != 0 ORDER BY SC_Score DESC 
        LIMIT 3 
     ) AS u)ORDER BY DATE_FORMAT(SC_Date, "%Y%m") DESC, SC_Score DESC 
+0

你确定你需要外部查询吗? - 我可能完全不了解MySQL查询的结构,但是看起来好像你将“DISTINCT”添加到子查询中,根本不需要外部查询。 – Aurimas 2012-02-07 12:18:54

+0

即使你设法纠正这个查询的语法在任何大桌子上极其缓慢。最好将其完全重写,但是你必须澄清你想要得到什么,可能有一些示例数据和预期输出。 – piotrm 2012-02-07 13:37:01

+0

它看起来相当可怕,但你究竟在寻找什么。看起来有一个分数表,你想要某个给定日期的前3名。但是对于你的“f”别名到内部查询的“sc_date”含糊不清。或..你是否在分数表中查找每天可用的前3名得分。所以,如果你有20天的分数,你需要所有20天中的前3个......需要完全不同的查询。 – DRapp 2012-02-07 16:41:27

回答

0

你不能未知列“f.SC_Date”在内部查询中使用f.SC_Date - 请记住括号中的位将首先运行,然后外部位将运行在结果上。

您需要在select语句中声明scores f才能使其工作。

我希望你不需要它了,但 - 是这样的:

SELECT * from scores f 
WHERE 
    SC_Id IN (
      SELECT SC_Id FROM (
        SELECT SC_Id from scores where DATE_FORMAT(SC_Date, "%Y%m") = DATE_FORMAT(SC_Date, "%Y%m") AND US_Id != 0 ORDER BY SC_Score DESC 
        LIMIT 3 
     ) AS u)ORDER BY DATE_FORMAT(SC_Date, "%Y%m") DESC, SC_Score DESC 

应该工作,除非我误以为是在这里你的意图。