2017-12-03 122 views
0

如何簡化查詢?這個查詢可以簡化嗎?我嘗試了一些 連接,但結果與下面的這個查詢不一樣。請給我 一些見解。如何簡化查詢

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 

回答

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