【问题标题】:How to optimize derived tables with union all query?如何使用联合所有查询优化派生表?
【发布时间】:2014-11-21 13:19:53
【问题描述】:

union all 查询如何优化派生表?


问题

  • 我想删除冗余。
  • “团队”表被使用了两次

   SELECT series_id, team, SUM(Win) As Won, SUM(Loss) as Lost
    FROM
    ( SELECT *,radiant_name as team, 
         CASE WHEN radiant_win = 1 THEN 1 ELSE 0 END as Win, 
         CASE WHEN radiant_win = 1 THEN 0 ELSE 1 END as Loss
      FROM matches
      UNION ALL
      SELECT *,dire_name as team, 
         CASE WHEN radiant_win = 0 THEN 1 ELSE 0 END as Win, 
         CASE WHEN radiant_win = 0 THEN 0 ELSE 1 END as Loss
      FROM matches
    ) as temp
    WHERE series_id = 8313
    GROUP By team
    ORDER By Won, Lost DESC

 

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    对此进行优化的领域包括:

    不要选择 *.只选择您需要的字段。换句话说,这是:

    SELECT *,radiant_name as team
    

    可以这样:

    SELECT series_id,radiant_name as team
    

    接下来,您的派生表没有过滤,因此它会查询整个表。这个:

    WHERE series_id = 8313
    

    应该进入您的子查询 - 两次。

    最后,如果您只对一个 series_id 感兴趣,那么选择它是没有意义的。您的查询可能类似于:

    SELECT team, SUM(Win) As Won, SUM(Loss) as Lost
    FROM
    ( SELECT radiant_name as team, 
     CASE WHEN radiant_win = 1 THEN 1 ELSE 0 END as Win, 
     CASE WHEN radiant_win = 1 THEN 0 ELSE 1 END as Loss
    FROM matches
    WHERE series_id = 8313
    
    UNION ALL
    
     SELECT dire_name as team, 
     CASE WHEN radiant_win = 0 THEN 1 ELSE 0 END as Win, 
     CASE WHEN radiant_win = 0 THEN 0 ELSE 1 END as Loss
     FROM matches
    WHERE series_id = 8313
    
    ) as temp
    GROUP By team
    ORDER By Won, Lost DESC
    

    【讨论】:

    • 您好,谢谢。结果返回 2 列如何使它只合并到 1 行?
    【解决方案2】:

    我认为,这些案例陈述是您查询中丑陋的部分。我会通过减去总计数的获胜次数来计算输赢,反之亦然:

    select series_id, team, sum(won), sum(lost)
      from
        (
          select series_id, radiant_name as team, sum(radiant_win) as won, count(*)-sum(radiant_win) as lost
            from matches
            group by series_id, radiant_name
          union all
          select series_id, dire_name as team, count(*)-sum(radiant_win) as won, sum(radiant_win) as lost
            from matches
            group by series_id, dire_name
        )
    where series_id = 8313
    group by series_id, team
    order by won, lost desc
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2016-02-27
    相关资源
    最近更新 更多