0

このクエリを使用しましたが、mysql サーバーがクラッシュしたか何かだと思います。今は届かない。これは偶然ですか、それとも私のクエリが悪いのでしょうか? 悪い場合はどうすれば修正できますか

400.000 行 2 つのテーブルで作業しています。1 つはスコアリストで、もう 1 つはユーザーです。

SELECT a.* 
from 
(
    SELECT @curRank := @curRank +1 AS ROW , s.UserId,
       s.AverageScore As Score, u.UserName 
    FROM  scorelisting s, (SELECT @curRank :=0) r, Users u 
    where u.UserId=s.UserId 
    order by AverageScore desc
) a 
where UserId = 95890
4

1 に答える 1

2

これを単純化しすぎているかどうかはわかりませんが、特定のユーザーが他のユーザーのランク内のどこにいるかを探している場合は、その人の「averageScore」が何であるかを調べてから、COUNT を取得します(*) 希望するレコードよりも平均が BETTER であるすべてのレコードを検索し、その人の名前を取得します... 次に、次のことを試してください。

改訂およびテスト済み -- SQL FIDDLE SQLFiddle のサンプルには、ユーザー af および averageScores がそれぞれ 10 ~ 60 の 6 つのエントリがあります。クエリはユーザー 3 (avgScore) を選択するため、3 (d、e、f) の平均値が高く (40、50、60)、ユーザー 'c' (id 3) が 4 位になります。

SELECT 
      u.UserName,
      PreQuery.AverageHigherThanYou +1 as UserRank
   from
      users u,
      ( select
              COUNT(*) as AverageHigherThanYou
           from 
              scoreListing s,
              ( select @MyAvg := s2.AverageScore
                   from scoreListing s2 
                   where s2.UserID = 95890 ) sqlvars
            where
               s.AverageScore > @MyAvg ) PreQuery
    where
       u.userid = 95890

「プレクエリ」は、特定のユーザーのスコアリストに静的に結合されたものよりも少ないすべてのカウントを取得し、単一の列の値に入れます。

次に、カンマのユーザー テーブル (古い ANSI、結合基準なし) は常に 1 つのレコードを返します...次に、1 人のユーザーの名前情報を取得するために、USER テーブルにのみ WHERE 句を適用します。

ここで、平均がどれくらい高いか、同じか、または低いかを知りたい場合は、クエリを次のように調整できます

  ( SELECT 
          sum( if( s.averageScore < s2.averageScore, 1, 0 )) as LowerAverageThanYou,
          sum( if( s.averageScore = s2.averageScore, 1, 0 )) as SameAverageAsYou,
          sum( if( s.averageScore > s2.averageScore, 1, 0 )) as HigherAverageThanYou
       from 
          scoreListing s
             join scoreListing s2
                ON s2.UserID = 95890 ) PreQuery,

再試行するには、マシンが解放されるまで待つ必要があります。

また、scoreListing テーブルには 2 つのインデックスがあります。その人の平均を比較するために UserID = 95890 レコードにジャンプする ID だけに 1 つと、averageScore にもう 1 つあるため、HIGHER THAN のみを実行した場合、WHERE 句はこれらのレコードのみをスキャンする必要があり、400,000 レコード全体ではありません。

于 2012-11-26T01:22:24.337 に答える