2012-07-23 91 views
2

我试图比较同一个表中的两个值,并检查是否有差异。 现在,我有1485条记录中cms_statistics_pages表,但在下面的查询:MySQL比较同一个表上的两个值

SELECT 
    cp.identifier, 
    COUNT(csp1.statID) AS hits, 
    COUNT(csp2.statID) AS hits_yesterday, 
    IF(COUNT(csp1.statID)>COUNT(csp2.statID),1,0) AS growth 
FROM cms_pages cp 
LEFT JOIN cms_statistics_pages csp1 
     ON csp1.pageID = cp.pageID 
     AND DATE(csp1.datetime) = '2012-07-20' 
LEFT JOIN cms_statistics_pages csp2 
     ON csp2.pageID = cp.pageID 
     AND DATE(csp2.datetime) = '2012-07-19' 
GROUP BY cp.identifier 

..是开除,我得到这些结果:

identifier     hits hits_yesterday growth 
index      13395 13395   0 
siden-er-under-opdatering 638  638    0 
vores-historie    0  3    0 

哪项不正确我的目的。然后,如果我改变:

AND DATE(csp1.datetime) = '2012-07-20' 

,以将匹配任何记录

日期
AND DATE(csp1.datetime) = '2012-07-21' 

我的结果现在看起来是这样的:

identifier     hits hits_yesterday growth 
index      0  141    0 
siden-er-under-opdatering 0  29    0 
vores-historie    0  3    0 

现在的点击率是正确的,所以我m想知道当两个连接都包含一些数据时,查询是否多次计算记录。从cms_pages

示例数据:从cms_statistics_pages

 

    pageID sectionID templateID identifier default title exclude_title 
    1  1  1   index 1  Welcome to SiteTech Framework 2012 

示例数据:

 

    statID frontend backend  pageID sectionID panel datetime 
    1  0  1  34  6  admin 2012-07-17 12:34:14 

回答

0

所以我一直在搞这个查询,发现了一个包含左连接和子查询的解决方案。我的查询现在看起来像:

SELECT 
    cp.identifier, 
    now.hits AS hits, 
    yd.hits AS hits_yesterday, 
    IF(now.hits>yd.hits,1,0) AS growth 
FROM cms_pages AS cp 
LEFT JOIN 
    (
     SELECT 
      pageID, 
      COUNT(pageID) AS hits 
     FROM cms_statistics_pages 
     WHERE DATE(datetime) = '2012-07-20' 
     GROUP BY pageID 
    ) now 
ON now.pageID = cp.pageID 
LEFT JOIN 
    (
     SELECT pageID, 
      COUNT(pageID) AS hits 
     FROM cms_statistics_pages 
     WHERE DATE(datetime) = '2012-07-19' 
     GROUP BY pageID 
    ) yd 
ON yd.pageID = cp.pageID 

这给了我这个正确的结果!:

identifier     hits hits_yesterday growth 
index      95  141    0 
siden-er-under-opdatering 22  29    0 
vores-historie    NULL 3    0