在左联接中使用子查询时如何优化查询

script本

表格: 请在这里查看表格。如何查询计算球队的特定胜利并找到系列冠军

问题:

  • 如何使查询更优化?
  • 如何减少查询冗余?
  • 如何使此查询更快?

概括

正如您在示例查询中看到的那样,这部分使用了很多次。

WHERE leagueid = 2096
AND start_time >= 1415938900
AND ((matches.radiant_team_id= 1848158 AND matches.dire_team_id= 15)
OR (matches.radiant_team_id= 15 AND matches.dire_team_id= 1848158))

SELECT matches.radiant_team_id,
       matches.dire_team_id,
       matches.radiant_name,
       matches.dire_name,
       TA.Count AS teamA,
       TB.Count AS teamB,
       TA.Count + TB.Count AS total_matches,
       SUM(TA.wins),
       SUM(TB.wins),
       (CASE
            WHEN series_type = 0 THEN 1
            WHEN series_type = 1 THEN 2
            WHEN series_type = 2 THEN 3
        END) AS wins_goal
FROM matches
LEFT JOIN
  (SELECT radiant_team_id,
          COUNT(id) AS COUNT,
          CASE
              WHEN matches.radiant_team_id = radiant_team_id && radiant_win = 1 THEN 1
          END AS wins
   FROM matches
   WHERE leagueid = 2096
     AND start_time >= 1415938900
     AND ((matches.radiant_team_id= 1848158
           AND matches.dire_team_id= 15)
          OR (matches.radiant_team_id= 15
              AND matches.dire_team_id= 1848158))
   GROUP BY radiant_team_id) AS TA ON TA.radiant_team_id = matches.radiant_team_id
LEFT JOIN
  (SELECT dire_team_id,
          COUNT(id) AS COUNT,
          CASE
              WHEN matches.dire_team_id = dire_team_id && radiant_win = 0 THEN 1
          END AS wins
   FROM matches
   WHERE leagueid = 2096
     AND start_time >= 1415938900
     AND ((matches.radiant_team_id= 1848158
           AND matches.dire_team_id= 15)
          OR (matches.radiant_team_id= 15
              AND matches.dire_team_id= 1848158))
   GROUP BY dire_team_id) AS TB ON TB.dire_team_id = matches.dire_team_id
WHERE leagueid = 2096
  AND start_time >= 1415938900
  AND ((matches.radiant_team_id= 1848158
        AND matches.dire_team_id= 15)
       OR (matches.radiant_team_id= 15
           AND matches.dire_team_id= 1848158))
GROUP BY series_id

预定比赛

ID| leagueid| team_a_id| team_b_id| starttime
 1|     2096|   1848158|        15| 1415938900
ffflabs

我相信无需子查询即可完成。

我做了下面的比赛表

在此处输入图片说明

并使用以下查询将结果分组,每个系列一行

SELECT 
      matches.leagueid,
      matches.series_id,
      matches.series_type,
      COUNT(id) as matches,
      IF(radiant_team_id=1848158,radiant_name, dire_name) AS teamA,
      IF(radiant_team_id=1848158,dire_name, radiant_name) AS teamB,
      SUM(CASE
           WHEN radiant_team_id=1848158 AND radiant_win=1  THEN 1
           WHEN dire_team_id=1848158 AND radiant_win=0 THEN 1
           ELSE 0 END) AS teamAwin,
      SUM(CASE
           WHEN radiant_team_id=15 AND radiant_win=1  THEN 1
           WHEN dire_team_id=15 AND radiant_win=0 THEN 1
           ELSE 0 END) AS teamBwin

FROM `matches` 
WHERE leagueid = 2096
     AND start_time >= 1415938900
AND dire_team_id IN (15, 1848158)
AND radiant_team_id IN  (15, 1848158)
group by leagueid,series_id,series_type,teamA,teamB

产生以下结果

在此处输入图片说明

请注意,在对一个系列的结果进行分组时,没有诸如发光团队或可怕团队之类的东西。在同一系列中,辐射和可怕的角色可能会切换几次,所以我只将团队称为teamA和teamB。

现在,看看您之前的问题,我发现您需要根据系列类型和每个团队的胜利来确定系列冠军。这将需要包装前一个查询并将其用作子查询,例如

SELECT matchresults.*,
      CASE series_type
      WHEN 0 then IF(teamAwin>=1, teamA,teamB)
      WHEN 1 then IF(teamAwin>=2, teamA,teamB)
      ELSE IF(teamAwin>=3, teamA,teamB)
      END as winner

from ( THE_MAIN_QUERY) as matchresults

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用多个左联接优化SQL查询

来自分类Dev

使用左联接优化MySql查询

来自分类Dev

在多个条件和子查询中使用LINQ左联接

来自分类Dev

左联接与子查询

来自分类Dev

左联接与子查询

来自分类Dev

如何在MySQL中使用子查询为报表优化多个联接的查询

来自分类Dev

如何在实体框架查询中使用左联接?

来自分类Dev

SQL在左联接中使用内部查询

来自分类Dev

内部联接左联接的视图/子查询时,计划错误

来自分类Dev

如何优化多个左联接SQL SELECT查询?

来自分类Dev

如何优化大表上的左联接查询

来自分类Dev

使用左联接优化Mysql查询组Concat

来自分类Dev

使用左联接在多个表上优化SQL查询

来自分类Dev

优化包含左联接的SQL查询

来自分类Dev

优化包含左联接的SQL查询

来自分类Dev

使用内部联接时如何优化Doctrine查询的数量?

来自分类Dev

在Snowflake中使用“左联接”条件创建递归查询?

来自分类Dev

如何优化包含联接和子查询的查询

来自分类Dev

使用子查询进行查询并进行联接优化

来自分类Dev

如何使用条件联接优化查询?

来自分类Dev

如何使用表联接优化此查询?

来自分类Dev

如何使用自联接优化此查询?

来自分类Dev

MySQL左联接子查询分组

来自分类Dev

MySQL左联接子查询,带*

来自分类Dev

效果:左联接vs子查询

来自分类Dev

SQL SERVER:左联接和子查询

来自分类Dev

带有左联接子查询的sql

来自分类Dev

编写左联接作为子查询

来自分类Dev

SQL SERVER:左联接和子查询