2012-02-07 23 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 

應該工作,除非我誤以爲是在這裏你的意圖。