如何简化查询

时间:2017-12-03 02:12:12

标签: mysql select

如何简化此查询?这个查询可以简化吗?我尝试了一些 加入但结果与下面的查询不一样。请给我 一些见解。

SELECT trafficbywebsite.`adwordsCampaignID`, 
trafficbywebsite.adwordsAdGroupID, trafficbywebsite.adPlacementDomain, 
trafficbywebsite.counts traffic, convertedtrafficbywebsite.counts 
convertedclicks
FROM
    (
        SELECT `adwordsAdGroupID`, `adPlacementDomain`, COUNT(*) counts
        FROM
            (
                 SELECT GA_entrances.*
                 FROM 
                    GA_entrances,
                    GA_conversions
                    WHERE 
                    GA_entrances.clientId=GA_conversions.clientId
                    AND (eventLabel='myurl' OR eventLabel='myotherurl')
                AND YEAR(GA_entrances.timestamp)>=2016 
                AND MONTH(GA_entrances.timestamp)>=6
                AND YEAR(GA_conversions.timestamp)>=2016 
                AND MONTH(GA_conversions.timestamp)>=6                  
                GROUP BY GA_entrances.clientId
                 ) clickers
               GROUP BY `adwordsAdGroupID`, `adPlacementDomain`
        ) convertedtrafficbywebsite
       ,(
       SELECT `adwordsCampaignID`, `adwordsAdGroupID`, adPlacementDomain, 
      COUNT(*) counts
      FROM 
        GA_entrances
      WHERE
        YEAR(timestamp)>=2016 
        AND MONTH(timestamp)>=6
    GROUP BY `adwordsAdGroupID`, `adPlacementDomain`
     ) trafficbywebsite
     WHERE
     convertedtrafficbywebsite.counts>=(trafficbywebsite.counts/10)
     ORDER BY traffic DESC

1 个答案:

答案 0 :(得分:2)

如果没有样本数据,很难确定,但似乎不太可能删除其中一个子查询。然而,你可以做的是改善你日期的方式。要避免的是使用数据上的函数来满足您的过滤条件。例如,您需要2016-06-01之前的数据,即单个日期,但您要修改每一行数据以匹配一年和一个月。

AND YEAR(GA_entrances.timestamp) >= 2016
AND MONTH(GA_entrances.timestamp) >= 6
AND YEAR(GA_conversions.timestamp) >= 2016
AND MONTH(GA_conversions.timestamp) >= 6
;

不需要所有这些功能,只需与单个日期进行比较:

AND GA_entrances.timestamp) >= '2016-06-01'
AND GA_conversions.timestamp >= '2016-06-01'
;

要避免的另一件事是使用逗号作为连接表的方法。这个25岁以上的ANSI标准语法。这是古老的加入方式:

    FROM GA_entrances, GA_conversions
    WHERE GA_entrances.clientId = GA_conversions.clientId

这被认为是最佳做法:

    GA_entrances.*
    FROM GA_entrances
    INNER JOIN GA_conversions ON GA_entrances.clientId = GA_conversions.clientId