2016-09-20 81 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 

以上查詢是要找到每個組的比賽中,查詢返回正確的結果,但它不是大data.Needed優化響應請您分享您的解決方案的失敗者。提前致謝。SQL查詢到這麼多的時間,需要優化

+0

運行'explain'併發布查詢計劃 – Rahul

+0

您是否在連接列上設置了索引? –

+0

添加** contest_unique_id =「iledhSBDO」 **進入內部子查詢** ** PREQ並 – StanislavL

回答

0

您可以嘗試將您的JOIN s移動到子查詢。此外,您應該注意外部查詢上的「錯誤」GROUP BY用法。在Mysql中,您可以按某些列進行分組,並且可以在沒有任何聚合函數的情況下選擇未在group子句中指定的其他列,但數據庫無法確保將返回給您的數據。爲了保持應用程序的一致性,將它們包裝在一個聚合函數中。

檢查這一項幫助:

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 :) Thankyou所有的建議(y) – user3296832

+0

@ user3296832不客氣。不要忘記接受任何答案作爲正確的答案。 –