2012-02-07 9 views
1

最後のnヶ月間にユニークな選手の上位3つの得点を取得しようとしています。私はエラーを取得していますクエリを実行しようとしている間:mysqlの副問合せ問題

不明な列「f.SC_Date」「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

+0

構文を修正してもこのクエリは大きなテーブルでは非常に遅いです。それを完全に書き直すほうがよいでしょうが、正確に何を得たいかを明確にしなければならないでしょう。 – piotrm

+0

それはむしろ恐ろしいように見えますが、実際に何を探していますか?スコア表があると思われ、特定の日付の場合はトップ3が必要です。しかし、内側のクエリへの "f"エイリアスの "sc_date"が不明確であるためです。あなたはスコア表で毎日トップ3の得点を探していますか?あなたが20日間のスコアを持っていれば、20日間のうちの3日間が必要です。全く異なるクエリが必要です。 – DRapp

答えて

0

私のクエリであるにそのような内側のクエリで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 

は、動作するはずです。