SQL查询需要优化

时间:2016-09-20 12:26:07

标签: mysql sql

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

以上查询是查找每组游戏的输家,查询返回准确的结果但是没有响应大数据。我该如何优化呢?

1 个答案:

答案 0 :(得分:0)

您可以尝试将JOIN移动到子查询。此外,你应该注意你的错误"外部查询的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
;

此外,此查询的某些部分可能看似多余,但这是因为我不想更改您编写的过滤器,只是移动它们。

另外,你的查询逻辑对我来说有点奇怪,基于表/列名称以及你如何编写它...请查看我的查询中的注释,它反映了我对你的实现的理解。

希望它有所帮助。