2016-09-20 8 views
-2
SELECT LM.user_id,LM.users_lineup_id, min(LM.total_score) AS total_score 
FROM vi_lineup_master LM JOIN 
    vi_contest AS C 
    ON C.contest_unique_id = LM.contest_unique_id join 
    (SELECT min(total_score) as total_score 
     FROM vi_lineup_master 
     GROUP BY group_unique_id 
    ) as preq 
    ON LM.total_score = preq.total_score 
WHERE LM.contest_unique_id = 'iledhSBDO' AND 
     C.league_contest_type = 1 
GROUP BY group_unique_id 

上記のクエリは、ゲームのグループごとに敗者を見つけて、正確な結果を返しますが、大きなデータでは応答しません。前もって感謝します。SQLクエリが時間がかかり、最適化が必要です

+0

'explain'を実行してクエリ計画を投稿します – Rahul

+0

結合列にインデックスを設定しましたか? –

+0

** contest_unique_id = 'iledhSBDO' **を内部サブクエリに追加します。** preq ** – StanislavL

答えて

0

JOINをサブクエリに移動できます。また、外側のクエリで "間違った" GROUP BYの使用に注意する必要があります。 Mysqlではいくつかの列でグループ化し、集計関数なしでgroup句に指定されていない他の列を選択できますが、データベースはどのデータを返しますかを保証することはできません。アプリケーションの一貫性を保つために、アプリケーションを集約関数でラップします。

チェックこの1つは場合に役立ちます:ちょうどそれらを移動し、

SELECT 
    MIN(LM.user_id) AS user_id, 
    MIN(LM.users_lineup_id) AS users_lineup_id, 
    MIN(LM.total_score) AS total_score 
FROM vi_lineup_master LM 
WHERE 1=1 
    -- check if this "contest_unique_id" is equals 
    -- to 'iledhSBDO' for a "league_contest_type" valued 1 
    AND LM.contest_unique_id IN 
    (
    SELECT C.contest_unique_id 
    FROM vi_contest AS C 
    WHERE 1=1 
     AND C.contest_unique_id = 'iledhSBDO' 
     AND C.league_contest_type = 1 
) 
    -- check if this "total_score" is one of the 
    -- "min(total_score)" from each "group_unique_id" 
    AND LM.total_score IN 
    (
    SELECT MIN(total_score) 
    FROM vi_lineup_master 
    GROUP BY group_unique_id 
) 
GROUP BY LM.group_unique_id 
; 

また、このクエリのいくつかの作品は冗長に見えるかもしれませんが、私はあなたが書いたフィルタを変更したくなかったので、それはです。

また、テーブル/列の名前と書き方に基づいて、クエリのロジックがちょっと変わっているようです...私の実装で理解したことを反映したクエリのコメントを確認してください。

希望します。

+0

はい、それは仕事をして、1以上のlacレコードで作業しています.......................ありがとうFelypp :)ありがとうあまりにも(y) – user3296832

+0

@ user3296832ようこそ。どんな答えも正しいものとして受け入れることを忘れないでください。 –

関連する問題